#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;
int main(){
cin.tie(nullptr)->sync_with_stdio(false);
int n, m, s, t, U, V; cin >> n >> m >> s >> t >> U >> V;
vector<vector<pair<int, i64>>> vc(n + 1), nvc(n + 1);
vector<vector<i64>> dis(n + 1, vector<i64>(4, 1e18)), dp(n + 1, vector<i64>(2));
for(int i = 1; i <= m; ++i){
int u, v; i64 w; cin >> u >> v >> w;
vc[u].emplace_back(v, w);
vc[v].emplace_back(u, w);
}
dis[s][0] = dis[t][1] = dis[U][2] = dis[V][3] = 0;
auto bfs = [&](int st, int t) -> void {
priority_queue<pair<i64, int>, vector<pair<i64, int>>, greater<pair<i64, int>>> pq;
pq.emplace(0, st);
while(!pq.empty()){
auto [d, u] = pq.top();
pq.pop();
if(dis[u][t] < d) continue;
for(auto [v, w]:vc[u]){
if(dis[v][t] > w + d){
dis[v][t] = w + d;
pq.emplace(dis[v][t], v);
}
}
}
};
bfs(s, 0); bfs(t, 1); bfs(U, 2); bfs(V, 3);
i64 ans = dis[U][3];
for(int i = 1; i <= n; ++i){
for(auto [j, w]:vc[i]){
if(dis[i][0] + w + dis[j][1] == dis[t][0] && dis[i][0] < dis[j][0]) nvc[i].emplace_back(j, w);
}
}
vector<int> node(n);
iota(node.begin(), node.end(), 1);
sort(node.begin(), node.end(), [&](int a, int b){
return dis[a][0] < dis[b][0];
});
for(int i = 1; i <= n; ++i) dp[i][0] = dp[i][1] = dis[i][2];
for(auto u:node){
for(auto [v, w]:nvc[u]) dp[v][0] = min(dp[v][0], dp[u][0]);
}
reverse(node.begin(), node.end());
for(auto u:node){
for(auto [v, w]:nvc[u]) dp[u][1] = min(dp[u][1], dp[v][1]);
}
for(int i = 1; i <= n; ++i) ans = min({ans, dp[i][0] + dis[i][3], dp[i][1] + dis[i][3]});
cout << ans << '\n';
}