#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<vector<pair<int, int>>> g;
vector<vector<int>> g2;
vector<tuple<int, int, int>> edge;
vector<int> ds, dt, du, dv, dp, top, in;
int n, m, s, t, u, v, ans=1e18;
set<int> li;
void dijkstra(int stn, vector<vector<pair<int, int>>> &g, vector<int> &d) {
d.assign(n+2, 1e18);
d[stn] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, stn});
while(!pq.empty()) {
int cd = pq.top().first, cn = pq.top().second;
pq.pop();
for(auto i: g[cn]) {
int nn = i.first, nd = cd+i.second;
if(d[nn] <= nd) continue;
d[nn] = nd;
pq.push({nd, nn});
}
}
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m >> s >> t >> u >> v;
g.assign(n+2, vector<pair<int, int>>());
g2.assign(n+2, vector<int>());
in.assign(n+2, 0);
while(m--) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
edge.push_back({u, v, w});
}
dijkstra(s, g, ds);
dijkstra(t, g, dt);
dijkstra(u, g, du);
dijkstra(v, g, dv);
int sp = ds[t];
for(auto i: edge) {
int u = get<0>(i), v = get<1>(i), w = get<2>(i);
if(ds[u] + dt[v] + w == sp) {
g2[u].push_back(v);
in[v]++;
li.insert(u);
li.insert(v);
}
if(ds[v] + dt[u] + w == sp) {
g2[v].push_back(u);
in[u]++;
li.insert(u);
li.insert(v);
}
}
deque<int> cli;
for(auto i: li) {
if(in[i] == 0) {
cli.push_back(i);
top.push_back(i);
}
}
while(!cli.empty()) {
int cn = cli.front();
cli.pop_front();
for(auto i: g2[cn]) {
in[i]--;
if(in[i] == 0) {
cli.push_back(i);
top.push_back(i);
}
}
}
ans = du[v];
dp.assign(n+2, 1e18);
for(int i: top) {
dp[i] = min(dp[i], du[i]);
ans = min(ans, dp[i]+dv[i]);
for(auto j: g2[i]) {
dp[j] = min(dp[j], dp[i]);
}
}
dp.assign(n+2, 1e18);
for(int i: top) {
dp[i] = min(dp[i], dv[i]);
ans = min(ans, dp[i]+du[i]);
for(auto j: g2[i]) {
dp[j] = min(dp[j], dp[i]);
}
}
cout << ans;
}