#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];
int vis[100010][2];
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 st){
stack<pair<int, long long>> stk;
stk.push({st, val[st][0]});
while(!stk.empty()){
auto u = stk.top(); stk.pop();
if(val[u.first][0] != u.second){
continue;
}
for(auto v: g[u.first]){
if(dist[v.first][0]+v.second == dist[u.first][0]){
if(min(val[u.first][0], dist[v.first][2]) < val[v.first][0]){
val[v.first][0] = min(val[v.first][0], min(val[u.first][0], dist[v.first][2]));
stk.push({v.first, val[v.first][0]});
}
}
}
}
}
void d2(int st){
stack<pair<int, long long>> stk;
stk.push({st, val[st][1]});
while(!stk.empty()){
auto u = stk.top(); stk.pop();
if(val[u.first][1] != u.second){
continue;
}
for(auto v: g[u.first]){
if(dist[v.first][3]+v.second == dist[u.first][3]){
if(min(val[u.first][1], dist[v.first][2]) < val[v.first][1]){
val[v.first][1] = min(val[v.first][1], min(val[u.first][1], dist[v.first][2]));
stk.push({v.first, val[v.first][1]});
}
}
}
}
}
int main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
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;
}