#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e15;
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});
}
}
}
}
vector<vector<Edge>> dag;
vector<bool> check;
void DFS(int u, const vector<ll>& distS) {
check[u] = true;
for (auto &e : adj[u]) {
int v = e.to; ll w = e.cost;
if (distS[v] == distS[u] + w) {
dag[u].push_back({v, w});
if (!check[v]) DFS(v, distS);
}
}
}
void Solve() {
vector<ll> distS, distU, distV;
Dijkstra(S, distS);
Dijkstra(U, distU);
Dijkstra(V, distV);
dag.assign(N + 1, vector<Edge>());
check.assign(N + 1, false);
DFS(S, distS);
vector<int> order(N);
iota(order.begin(), order.end(), 1);
sort(order.begin(), order.end(), [&](int a,int b){ return distS[a] < distS[b]; });
vector<ll> bx(N + 1, INF), by(N + 1, INF);
ll ans = INF;
for (int u : order) {
bx[u] = min(bx[u], distU[u]);
by[u] = min(by[u], distV[u]);
for (auto &e : dag[u]) {
int v = e.to;
bx[v] = min(bx[v], bx[u]);
by[v] = min(by[v], by[u]);
}
}
for (int u = 1; u <= N; u++) {
ans = min(ans, min(bx[u] + distV[u], by[u] + distU[u]));
}
cout << ans << "\n";
}
int main() {
Init();
Input();
Solve();
return 0;
}