#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define ll long long
#define nl "\n"
#define all(v) v.begin(),v.end()
#define baraa ios_base::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
int main() {
baraa
ll n, m, s, t, x, y;
cin >> n >> m >> s >> t >> x >> y;
vector<array<ll, 3> > edges(2 * m), adj[n + 1];
vector<ll> good(2 * m), dir(2 * m);
for (ll i = 0, u, v, c; i < 2 * m; i += 2) {
cin >> u >> v >> c;
edges[i] = {u, v, c};
edges[i + 1] = {v, u, c};
adj[u].push_back({v, c, i});
adj[v].push_back({u, c, i + 1});
}
auto dijk = [&](ll st) {
vector<ll> d(n + 1, 1e16);
priority_queue<array<ll, 2>, vector<array<ll, 2> >, greater<> > pq;
pq.push({d[st] = 0, st});
while (pq.size()) {
auto [c, u] = pq.top();
pq.pop();
if (c > d[u])continue;
for (auto [v, w, idx]: adj[u])
if (c + w < d[v])
pq.push({d[v] = c + w, v});
}
return d;
};
auto dS = dijk(s), dT = dijk(t);
for (ll i = 0; i < 2 * m; i++) {
auto [u, v, c] = edges[i];
good[i] = (dS[u] + c + dT[v] == dS[t] or (dT[u] + c + dS[v] == dS[t]));
if ((dS[u] + c + dT[v] == dS[t]))dir[i] = 1;
else if ((dT[u] + c + dS[v] == dS[t]))dir[i] = 2;
// cout << u << ' ' << v << ' ' << dS[u] + c + dT[v] << nl;
// if (good[i])
// cout << "good: " << u << ' ' << v << ' ' << c << ' ' << (i & 1) << nl;
}
vector d(n + 1, vector(3, vector<ll>(3, 1e16)));
priority_queue<array<ll, 4>, vector<array<ll, 4> >, greater<> > pq;
pq.push({d[x][0][0] = 0, 0, 0, x});
ll res = 1e16;
while (pq.size()) {
auto [cost, state1, state2, u] = pq.top();
pq.pop();
if (cost > d[u][state1][state2])continue;
if (u == y)res = min(res, cost);
// cout << u << ' ' << state1 << ' ' << state2 << ' ' << cost << nl;
for (auto [v, w, idx]: adj[u]) {
if (state1 == 0) {
if (cost + w < d[v][0][0])
pq.push({d[v][0][0] = cost + w, 0, 0, v});
if (good[idx] and cost < d[v][1][dir[idx]])
pq.push({d[v][1][dir[idx]] = cost, 1, dir[idx], v});
} else if (state1 == 1) {
if (cost < d[v][1][dir[idx]] and good[idx] and dir[idx] == state2)
pq.push({d[v][1][dir[idx]] = cost, 1, dir[idx], v});
}
if (cost + w < d[v][2][0])
pq.push({d[v][2][0] = cost + w, 2, 0, v});
}
}
cout << res;
return 0;
}