#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
template <class T> bool ckmax(T &a, T b) { return a < b ? (a = b, true) : false; }
template <class T> bool ckmin(T &a, T b) { return a > b ? (a = b, true) : false; }
const int MAXN = 1e5 + 5;
vector<pair<int, int>> g[MAXN];
int n, m, s, t, u, v;
ll ds[MAXN], dt[MAXN], du[MAXN], dv[MAXN], dp[MAXN], dp1[MAXN];
pair<pair<int, int>, int> e[MAXN * 2];
void dijkstra(int st, ll d[MAXN]) {
using T = pair<ll, int>;
d[st] = 0;
priority_queue<T, vector<T>, greater<T>> pq;
pq.emplace(0, st);
while (pq.size()) {
auto [dd, u] = pq.top();
pq.pop();
if (dd > d[u]) continue;
for (auto [v, w] : g[u]) {
if (ckmin(d[v], d[u] + w)) {
pq.emplace(d[v], v);
}
}
}
}
vector<int> adj[MAXN];
int in[MAXN];
int main() {
#define NAME ""
if (fopen(NAME".inp", "r")) {
freopen(NAME".inp", "r", stdin);
freopen(NAME".out", "w", stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> s >> t >> u >> v;
for (int i = 1; i <= m; i++) {
int u, v, w; cin >> u >> v >> w;
g[u].emplace_back(v, w);
g[v].emplace_back(u, w);
e[i] = {{u, v}, w};
}
memset(ds, 0x3f, sizeof ds);
memset(dt, 0x3f, sizeof dt);
memset(du, 0x3f, sizeof du);
memset(dv, 0x3f, sizeof dv);
dijkstra(s, ds);
dijkstra(t, dt);
dijkstra(u, du);
dijkstra(v, dv);
for (int i = 1; i <= m; i++) {
int u = e[i].fi.fi;
int v = e[i].fi.se;
int w = e[i].se;
if (ds[u] + w + dt[v] == ds[t] && ds[u] < ds[v])
adj[u].push_back(v), in[v]++;
if (ds[v] + w + dt[u] == ds[t] && ds[v] < ds[u])
adj[v].push_back(u), in[u]++;
}
queue<int> q;
for (int i = 1; i <= n; i++) {
if (in[i] == 0) q.emplace(i);
}
vector<int> topo;
while (q.size()) {
int u = q.front(); q.pop();
topo.emplace_back(u);
for (int v : adj[u]) {
if (--in[v] == 0) {
q.emplace(v);
}
}
}
assert((int)topo.size() == n);
ll ans = du[v];
memset(dp, 0x3f, sizeof dp);
memset(dp1, 0x3f, sizeof dp1);
for (int i : topo) {
ckmin(dp[i], du[i]);
ckmin(dp1[i], dv[i]);
// debug(i, dp[i]);
for (int j : adj[i]) {
ckmin(dp[j], dp[i]);
ckmin(dp1[j], dp1[i]);
}
}
for (int i = 1; i <= n; i++) ckmin(ans, dp[i] + dv[i]), ckmin(ans, dp1[i] + du[i]);
cout << ans << '\n';
return 0;
}