#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
struct Edge {
int to;
ll cost;
};
int N, M, S, T, U, V;
vector<vector<Edge>> adj;
void Init() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
void Input() {
cin >> N >> M;
cin >> S >> T >> U >> V;
adj.assign(N + 1, vector<Edge>());
for (int i = 0; i < M; i++) {
int a, b; ll c;
cin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
}
void Dijkstra(int start, vector<ll>& dist) {
dist.assign(N + 1, INF);
dist[start] = 0;
priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
pq.push({0, start});
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (auto &e : adj[u]) {
int v = e.to; ll w = e.cost;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
}
void Solve() {
vector<ll> distS, distT, distU, distV;
Dijkstra(S, distS);
Dijkstra(T, distT);
Dijkstra(U, distU);
Dijkstra(V, distV);
vector<vector<int>> dag(N + 1);
vector<int> in_deg(N + 1, 0);
for (int u = 1; u <= N; u++) {
for (auto &e : adj[u]) {
int v = e.to;
ll w = e.cost;
if (distS[u] + w + distT[v] == distS[T]) {
dag[u].push_back(v);
in_deg[v]++;
}
}
}
vector<ll> dpU = distU;
vector<ll> dpV = distV;
queue<int> q;
for (int i = 1; i <= N; i++) if (in_deg[i] == 0) q.push(i);
ll ans = distU[V];
while (!q.empty()) {
int u = q.front(); q.pop();
ans = min(ans, dpU[u] + distV[u]);
ans = min(ans, dpV[u] + distU[u]);
for (int v : dag[u]) {
dpU[v] = min(dpU[v], dpU[u]);
dpV[v] = min(dpV[v], dpV[u]);
if (--in_deg[v] == 0) q.push(v);
}
}
cout << ans << "\n";
}
int main() {
Init();
Input();
Solve();
return 0;
}