#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<pair<int, long long>>> g;
long long val[100010][2], dist[100010][4];
void dijkstra(int st, int rr){
priority_queue<pair<long long, int>> pq;
pq.push({0, st});
while(!pq.empty()){
auto u = pq.top(); pq.pop();
if(dist[u.second][rr] < -u.first){
continue;
}
for(auto v: g[u.second]){
if(dist[v.first][rr] > -u.first+v.second){
dist[v.first][rr] = -u.first+v.second;
pq.push({-dist[v.first][rr], v.first});
}
}
}
}
void d1(int u){
for(auto v: g[u]){
if(dist[v.first][0]+v.second == dist[u][0]){
val[v.first][0] = min(val[v.first][0], min(val[u][0], dist[v.first][2]));
d1(v.first);
}
}
}
void d2(int u){
for(auto v: g[u]){
if(dist[v.first][3]+v.second == dist[u][3]){
val[v.first][1] = min(val[v.first][1], min(val[u][1], dist[v.first][2]));
d2(v.first);
}
}
}
int main(){
cin >> n >> m;
int s, t, u1, u2; cin >> s >> t >> u1 >> u2;
g = vector<vector<pair<int, long long>>> (n+5);
for(int i = 1; i <= m; i ++){
long long a, b, c; cin >> a >> b >> c;
g[a].push_back({b, c});
g[b].push_back({a, c});
}
for(int i = 1; i <= n; i++){
val[i][0] = val[i][1] = 1e18;
dist[i][0] = dist[i][1] = dist[i][2] = dist[i][3] = 1e18;
}
dist[s][0] = 0; dist[u1][1] = 0; dist[u2][2] = 0; dist[t][3] = 0;
dijkstra(s, 0);
dijkstra(t, 3);
dijkstra(u1, 1);
dijkstra(u2, 2);
val[t][0] = dist[t][2];
d1(t);
val[s][1] = dist[s][2];
d2(s);
long long mn = 1e18;
for(int i = 1; i <= n; i ++){
mn = min(mn, dist[i][1]+min(val[i][0], val[i][1]));
//cout << val[i][0] << " " << val[i][1] << endl;
}
cout << min(mn, dist[u2][1]) << endl;
return 0;
}