#include <bits/stdc++.h>
// #ifndef ONLINE_JUDGE
// #include <debug.h>
// #else
// #define debug(...)
// #endif
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
constexpr int MAX = 2e+5 + 1, INF = 2e+16, MOD = 1e+9 + 7, K = 31;
vector <pair<int, int>> g[MAX+2];
vector <int> dijkstra(int n, int s) {
priority_queue <pair<int, int>, vector <pair<int, int>>, greater<pair<int, int>>> q;
q.push({0, s});
vector <int> dis(n+1, INF);
dis[s] = 0;
while (!q.empty()) {
auto [d, u] = q.top();
q.pop();
if (d != dis[u]) continue;
for (auto &[to, c] : g[u]) {
if (dis[to] > d + c) {
dis[to] = d + c;
q.push({dis[to], to});
}
}
}
return dis;
}
vector <pair<int, int>> g1[MAX+2];
vector <int> ts, col(MAX+2, 0), par[MAX+2];
void dfs(int u) {
col[u] = 1;
for (auto &[i, c] : g1[u]) {
if (col[i]) continue;
dfs(i);
}
ts.pb(u);
}
void _() {
int n, m;
cin >> n >> m;
int S, T, U, V;
cin >> S >> T >> U >> V;
vector <array <int, 3>> e;
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
g[a].pb({b, c});
g[b].pb({a, c});
e.pb({a, b, c});
}
vector <int> ds, dt, du, dv;
ds = dijkstra(n, S);
dt = dijkstra(n, T);
du = dijkstra(n, U);
dv = dijkstra(n, V);
for (auto &[a, b, c] : e) {
if (ds[a] + c + dt[b] == ds[T]) {
g1[a].pb({b, c});
par[b].pb(a);
}
}
for (int i = 1; i <= n; i++) {
if (!col[i]) dfs(i);
}
reverse(all(ts));
vector <int> dp = du;
int res = du[V];
for (int &i : ts) {
for (int &j : par[i]) {
dp[i] = min(dp[i], dp[j]);
}
res = min(res, dp[i] + dv[i]);
}
dp = dv;
for (int &i : ts) {
for (int &j : par[i]) {
dp[i] = min(dp[i], dp[j]);
}
res = min(res, dp[i] + du[i]);
}
cout << res;
}
signed main() {
GOOD_LUCK
int tests=1;
// cin >> tests;
for (int i=1; i <= tests; i++) {
_();
cout << endl;
}
return 0;
}