// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 1e18 + 7;
const int maxn = 1e5 + 10;
int n, m;
int s, t, u, v;
vector<pair<int, int>> adj[maxn];
vector<int> adjdag[maxn];
int vis[maxn];
vector<int> topo;
//dijkstra
vector<ll> dijkstra(int a){
vector<ll> dist(n + 1, INF);
dist[a] = 0;
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
pq.push({0, a});
while(!pq.empty()){
int x = pq.top().se;
ll d = pq.top().fi;
pq.pop();
if(d > dist[x]) continue;
for(auto &elm: adj[x]){
if(dist[elm.fi] > d + elm.se){
dist[elm.fi] = d + elm.se;
pq.push({dist[elm.fi], elm.fi});
}
}
}
return dist;
}
//dfs
void dfs(int a){
vis[a] = 1;
for(auto &elm: adjdag[a]){
if(vis[elm]) continue;
dfs(elm);
}
topo.push_back(a);
}
void solve(){
cin >> n >> m;
cin >> s >> t >> u >> v;
for(int i=1; i<=m; ++i){
int a, b, c;cin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
vector<ll> distS = dijkstra(s);
vector<ll> distT = dijkstra(t);
vector<ll> distU = dijkstra(u);
vector<ll> distV = dijkstra(v);
for(int i=1; i<=n; ++i){
for(auto &elm: adj[i]){
if(distS[i] + elm.se + distT[elm.fi] == distS[t]){
adjdag[i].push_back(elm.fi);
}
}
}
for(int i=1; i<=n; ++i) if(!vis[i]) dfs(i);
vector<ll> dpU(n + 1, INF);
vector<ll> dpV(n + 1, INF);
ll ans = INF;
for(auto &x: topo){
dpU[x] = distU[x];
dpV[x] = distV[x];
for(auto &elm: adjdag[x]){
dpU[x] = min(dpU[x], dpU[elm]);
dpV[x] = min(dpV[x], dpV[elm]);
}
ans = min(ans, dpU[x] + distV[x]);
ans = min(ans, dpV[x] + distU[x]);
}
cout << ans << '\n';
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
solve();
}