#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define st first
#define nd second
#define pb push_back
#define pii pair<int,int>
#define pll pair<ll,ll>
const int maxn = 1e5+7;
const ll INF = 1e18;
vector<pll> graf[maxn];
vector<int> dag[maxn];
int wchodzace[maxn];
ll min1[maxn];
ll min2[maxn];
ll odl[maxn][4];
void dijkstra(int x,int nr,int n){
priority_queue<pll> Q;
for(int i=1;i<=n;i++){
odl[i][nr] = INF;
}
Q.push({0,x});
while(Q.size() != 0){
auto [d,v] = Q.top();
d = -d;
Q.pop();
if(odl[v][nr] != INF)
continue;
odl[v][nr] = d;
for(auto i : graf[v]){
if(odl[i.st][nr] != INF)
continue;
Q.push({-(d+i.nd),i.st});
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,m,s,t,u,v;
cin>>n>>m;
cin>>s>>t;
cin>>u>>v;
vector<pair<pii,ll>> krawedzie;
int a,b,c;
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
graf[a].pb({b,c});
graf[b].pb({a,c});
krawedzie.pb({{a,b},c});
}
dijkstra(s,0,n);
dijkstra(t,1,n);
dijkstra(u,2,n);
dijkstra(v,3,n);
ll najkrotsza = odl[t][0], wyn = odl[v][2];
for(auto [p,d] : krawedzie){
if(odl[p.st][0] + odl[p.nd][1] + d == najkrotsza){
dag[p.st].pb(p.nd);
wchodzace[p.nd]++;
}
if(odl[p.st][1] + odl[p.nd][0] + d == najkrotsza){
dag[p.nd].pb(p.st);
wchodzace[p.st]++;
}
}
vector<int> topo;
queue<int> Q;
for(int i=1;i<=n;i++){
if(wchodzace[i] == 0)
Q.push(i);
}
while(Q.size() != 0){
auto x = Q.front();
Q.pop();
topo.pb(x);
for(auto i : dag[x]){
wchodzace[i]--;
if(wchodzace[i] == 0)
Q.push(i);
}
}
reverse(topo.begin(),topo.end());
for(auto i : topo){
min1[i] = odl[i][3];
min2[i] = odl[i][2];
for(auto j : dag[i]){
min1[i] = min(min1[i],min1[j]);
min2[i] = min(min2[i],min2[j]);
}
wyn = min(wyn,min1[i] + odl[i][2]);
wyn = min(wyn,min2[i] + odl[i][3]);
}
cout<<wyn<<"\n";
return 0;
}