#include<bits/stdc++.h>
using namespace std;
using pli = pair<long long, int>;
using pil = pair<int, long long>;
int n, m;
void dijkstra(int s, vector<long long> &dist, vector<vector<pil>> &adj) {
dist[s] = 0;
vector<bool> flag(n+1, false);
priority_queue<pli, vector<pli>, greater<pli>> pq;
pq.push({dist[s], s});
while(!pq.empty()) {
int uu = pq.top().second;
pq.pop();
if(flag[uu]) continue;
flag[uu] = true;
for(auto vw : adj[uu]) {
int vv = vw.first;
long long ww = vw.second;
if(dist[vv] > dist[uu] + ww) {
dist[vv] = dist[uu] + ww;
pq.push({dist[vv], vv});
}
}
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
const long long inf = 1000000000000007;
int s, t, u, v; cin >> n >> m >> s >> t >> u >> v;
vector<vector<pil>> adj(n+1);
for(int i = 1; i <= m; i++) {
int a, b;
long long c; cin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
// dijkstra from S
vector<long long> distS(n+1, inf);
dijkstra(s, distS, adj);
//dijkstra from T
vector<long long> distT(n+1, inf);
dijkstra(t, distT, adj);
//dijkstra from U
vector<long long> distU(n+1, inf);
dijkstra(u, distU, adj);
//dijkstra from V
vector<long long> distV(n+1, inf);
dijkstra(v, distV, adj);
long long ans = 0;
ans = distU[v];
for(int a = 1; a <= n; a++) {
for(int b = 1; b <= n; b++) {
if(distS[a] + distT[a] == distS[t] && distS[b] + distT[b] == distS[t]) {
ans = min({ans, distU[a] + distV[b], distU[b] + distV[a]});
}
}
}
cout << ans << "\n";
return 0;
}