#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define endl '\n'
#define ff first
#define ss second
#define pb push_back
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define ar array
const int MOD = 1e9 + 7,INF = 1e18, N = 2e5 + 5;
/*
5 2
1 2 2
2 3 2
3 4 2
4 5 2
*/
void solve(){
int n, m;
cin >> n >> m;
int s, t, u, v;
cin >> s >> t >> u >> v;
int ans = INF;
vector <vector <pair<int,int>>> g(n +1);
for(int i = 0;i < m;i++){
int a, b, c;
cin >> a >> b >> c;
g[a].pb({b, c});
g[b].pb({a, c});
}
vector <vector <int>> p(n + 1);
{
vector <int> cnt(n + 1, INF);
cnt[s] = 0;
set <pair<int,int>> st;
st.insert({0 , s});
while(!st.empty()){
int x = st.begin() -> ss;
st.erase(st.begin());
for(auto [i , c] : g[x]){
if(cnt[i] > cnt[x] + c){
cnt[i] = cnt[x] + c;
p[i].clear();
p[i].pb(x);
st.insert({cnt[i] , i});
}
else if(cnt[i] == cnt[x] + c){
p[i].pb(x);
}
}
}
}
vector <int> b;
b.pb(t);
queue <int> q;
q.push(t);
vector <int> used(n + 1);
while(!q.empty()){
int x = q.front();
q.pop();
// cout<<x<<endl;
for(int i : p[x]){
if(!used[i]){
used[i] = 1;
q.push(i);
b.pb(i);
}
}
}
vector <int> cntu(n + 1, INF) , cntv(n + 1, INF);
{
cntu[u] = 0;
set <pair<int,int>> st;
st.insert({0 , u});
while(!st.empty()){
int x = st.begin() -> ss;
st.erase(st.begin());
for(auto [i , c] : g[x]){
if(cntu[i] > cntu[x] + c){
cntu[i] = cntu[x] + c;
st.insert({cntu[i] , i});
}
}
}
}
{
cntv[v] = 0;
set <pair<int,int>> st;
st.insert({0 , v});
while(!st.empty()){
int x = st.begin() -> ss;
st.erase(st.begin());
for(auto [i , c] : g[x]){
if(cntv[i] > cntv[x] + c){
cntv[i] = cntv[x] + c;
st.insert({cntv[i] , i});
}
}
}
}
ans = min(ans , cntu[v]);
for(int i = 0;i < (int)b.size();i++){
for(int j = i + 1;j < (int)b.size();j++){
int f = 0;
int h = b[i];
int y = b[j];
{
queue <int> qi;
qi.push(h);
vector <int> us(n + 1);
while(!qi.empty()){
int x = qi.front();
qi.pop();
for(int i : p[x]){
if(!us[i]){
if(i == y){
f = 1;
}
qi.push(i);
us[i] = 1;
}
}
}
}
{
queue <int> qi;
qi.push(y);
vector <int> us(n + 1);
while(!qi.empty()){
int x = qi.front();
qi.pop();
for(int i : p[x]){
if(!us[i]){
if(i == h){
f = 1;
}
qi.push(i);
us[i] = 1;
}
}
}
}
if(f){
// cout<<"HERE"<<endl;
// cout<<h<<' '<<y<<endl;
// cout<<cntv[h]<<' '<<cntu[y]<<endl<<cntu[h]<<' '<<cntv[y]<<endl<<endl;
ans = min(ans , cntu[h] + cntv[y]);
ans = min(ans , cntu[y] + cntv[h]);
}
}
}
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int ti = 1;
while (ti--) {
solve();
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |