/**
* بسم الله الرحمن الرحيم *
﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿
*/
/// author : ASGA"
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using lll=__int128;
using ld=long double;
const ll inf=1e18;
void dij(int N,vector<ll>&d,const vector<vector<array<ll,2>>>&a){
d[N]=0;
priority_queue<array<ll,2>,vector<array<ll,2>>,greater<array<ll,2>>>q;
q.push({0,N});
while(!q.empty()){
ll i=q.top()[1],w=q.top()[0];q.pop();
for(auto&[j,c]:a[i]){
if(w+c<d[j]){
d[j]=w+c;
q.push({d[j],j});
}
}
}
}
signed main(){
ios_base::sync_with_stdio(0);cin.tie(0);
int n,m;cin>>n>>m;
int S,T,U,V;cin>>S>>T>>U>>V;
S--;T--;U--;V--;
vector<vector<array<ll,2>>>a(n);
vector<array<ll,3>>e;
while(m--){
int u,v,c;cin>>u>>v>>c;u--;v--;
a[u].push_back({v,c});
a[v].push_back({u,c});
e.push_back({u,v,c});
}
vector<ll>ds(n,inf),du(n,inf),dv(n,inf);
dij(S,ds,a);
dij(U,du,a);
dij(V,dv,a);
vector<vector<int>>g(n);
for(auto&[i,j,c]:e){
if(ds[i]>ds[j])swap(i,j);
if(ds[i]+c==ds[j])g[i].push_back(j);
}
vector<int>v(n,-1);
auto c=[&](int i,auto&c)->int{
int&r=v[i];
if(r==-1){
r=0;
for(int&j:g[i])r|=c(j,c);
if(i==T)r=1;
}
return r;
};
c(S,c);
ll ans=du[V];
vector<ll>vl(n,-1);
auto cc=[&](int i,auto&cc)->ll{
ll&r=vl[i];
if(r==-1){
r=inf;
for(int&j:g[i])r=min(r,cc(j,cc));
if(v[i]==1)r=min(r,dv[i]);
}
return r;
};
cc(S,cc);
for(int i=0;i<n;i++){
if(v[i])ans=min(ans,du[i]+vl[i]);
}
cout<<ans<<'\n';
return 0;
}