#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
int S, T, U, V;
cin >> S >> T >> U >> V, --S, --T, --U, --V;
vector<vector<pair<int, ll>>> g(n);
vector<tuple<int, int, ll>> edg(m);
for(int i = 0, u, v; i < m; ++i) {
ll w;
cin >> u >> v >> w, --u, --v;
g[u].push_back({v, w});
g[v].push_back({u, w});
edg[i] = {u, v, w};
}
const ll inf = (1ll << 60);
auto dijkstra = [&](int src) {
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
vector<ll> dist(n, inf);
dist[src] = 0;
pq.push({0, src});
while(pq.size()) {
auto [d, u] = pq.top();
pq.pop();
if(d > dist[u]) continue;
for(auto [v, w] : g[u]) {
if(dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
return dist;
};
auto dS = dijkstra(S);
auto dT = dijkstra(T);
auto dU = dijkstra(U);
auto dV = dijkstra(V);
ll D = dS[T];
vector<vector<int>> dag(n);
for(auto [a, b, w] : edg) {
if(dS[a] + w + dT[b] == D)
dag[a].push_back(b);
if(dS[b] + w + dT[a] == D)
dag[b].push_back(a);
}
vector<int> ord(n);
iota(ord.begin(), ord.end(), 0);
ranges::sort(ord, [&](auto x, auto y) {
return dS[x] < dS[y];
});
auto bestU = dU;
auto bestV = dV;
ll ans = inf;
for(int u : ord) {
ans = min(ans, bestU[u] + dV[u]);
ans = min(ans, bestV[u] + dU[u]);
for(int v : dag[u]) {
bestU[v] = min(bestU[u], bestU[v]);
bestV[v] = min(bestV[u], bestV[v]);
}
}
cout << ans << "\n";
return 0;
}