#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define vvi vector<vi>
#define pii pair<int,int>
const int INF = 4e18;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
cin>>n>>m;
int S,T,U,V;
cin>>S>>T;
cin>>U>>V;
--S; --T; --U; --V;
vector<vector<array<int,2>>> g(n);
vector<array<int,3>> edges;
for(int i=0;i<m;i++){
int a,b,w;
cin>>a>>b>>w;
--a; --b;
g[a].push_back({b,w});
g[b].push_back({a,w});
edges.push_back({a,b,w});
}
auto dijkstra = [&](int src){
vi dist(n,INF);
priority_queue<pii,vector<pii>,greater<pii>> pq;
dist[src]=0;
pq.push({0,src});
while(!pq.empty()){
auto [d,v]=pq.top();
pq.pop();
if(d!=dist[v]) continue;
for(auto [to,w]:g[v]){
if(dist[to]>d+w){
dist[to]=d+w;
pq.push({dist[to],to});
}
}
}
return dist;
};
vi dS=dijkstra(S);
vi dT=dijkstra(T);
vi dU=dijkstra(U);
vi dV=dijkstra(V);
vector<vector<int>> dag(n);
for(auto [a,b,w]:edges){
if(dS[a]+w+dT[b]==dS[T]){
dag[a].push_back(b);
}
if(dS[b]+w+dT[a]==dS[T]){
dag[b].push_back(a);
}
}
vi ord(n);
iota(ord.begin(),ord.end(),0);
sort(ord.begin(),ord.end(),[&](int a,int b){
return dS[a]<dS[b];
});
vi mnU=dU;
vi mnV=dV;
reverse(ord.begin(),ord.end());
for(int v:ord){
for(int to:dag[v]){
mnU[v]=min(mnU[v],mnU[to]);
mnV[v]=min(mnV[v],mnV[to]);
}
}
int ans=dU[V];
for(int v=0;v<n;v++){
ans=min(ans,dU[v]+mnV[v]);
ans=min(ans,dV[v]+mnU[v]);
}
cout<<ans<<"\n";
}