#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int nmax = 1e5 + 5;
const ll inf = 1e16;
int n, m, S, T, U, V;
vector <pair <int, ll>> g[nmax];
ll ds[nmax], dt[nmax], du[nmax], dv[nmax], dpu[nmax], dpv[nmax];
vector <int> topo, dag[nmax];
bool dd[nmax];
void dijkstra(int start, ll d[]) {
for (int i=1; i<=n; i++)
d[i] = inf;
d[start] = 0;
priority_queue <pair <ll, int>, vector <pair <ll, int>>, greater<>> pq;
pq.push({0, start});
while (!pq.empty()) {
auto [dist, u] = pq.top(); pq.pop();
if (dist>d[u]) continue;
for (auto [v, w] : g[u]) {
if (dist+w<d[v]) {
d[v] = dist + w;
pq.push({d[v], v});
}
}
}
}
void dfs(int u) {
dd[u] = true;
for (int v : dag[u])
if (!dd[v]) dfs(v);
topo.push_back(u);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> S >> T >> U >> V;
while (m--) {
int u, v; ll w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
dijkstra(S, ds);
dijkstra(T, dt);
dijkstra(U, du);
dijkstra(V, dv);
for (int u=1; u<=n; u++)
for (auto [v, w] : g[u])
if (ds[u] + w + dt[v]==ds[T]) dag[u].push_back(v);
for (int i=1; i<=n; i++)
if (!dd[i]) dfs(i);
for (int i=1; i<=n; i++) {
if (ds[i]+dt[i]!=ds[T]) dpu[i] = dpv[i] = inf;
else {
dpu[i] = du[i];
dpv[i] = dv[i];
}
}
reverse(topo.begin(), topo.end());
ll ans = du[V];
for (int u : topo) {
ans = min(ans, dpu[u] + dv[u]);
ans = min(ans, dpv[u] + du[u]);
for (int v : dag[u]) {
dpu[v] = min(dpu[v], dpu[u]);
dpv[v] = min(dpv[v], dpv[u]);
}
}
cout << ans;
return 0;
}