#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll inf = (1LL << 62);
#define MAXN 1000005
ll ans;
vector <pair<ll,ll>> E[MAXN];
vector <ll> ds, dt, du, dv, BU,BV, G1[MAXN], G2[MAXN];
bool cmp1(int x,int y) {
return ds[x] < ds[y];
}
void dijkstra(int x, vector <ll>& D) {
priority_queue <pair<ll,int>> q;
q.push({0, x});
while(!q.empty()) {
auto [c, d] = q.top();
q.pop();
for(auto [i, ct] : E[d]) {
if(D[i] <= D[d] + ct) continue;
D[i] = D[d] + ct;
q.push({-D[i], i});
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
int S, T, U, V;
cin >> S >> T;
cin >> U >> V;
ds.assign(N + 1, inf);
dt.assign(N + 1, inf);
du.assign(N + 1, inf);
dv.assign(N + 1, inf);
for(int i = 1; i <= M; i++) {
int u, v, t;
cin >> u >> v >> t;
E[u].push_back({v, t});
E[v].push_back({u, t});
}
ds[S] = dt[T] = du[U] = dv[V] = 0;
dijkstra(S, ds);
dijkstra(T, dt);
dijkstra(U, du);
dijkstra(V, dv);
for(int i = 1; i <= N; i++) {
for(auto [nd, ct] : E[i]) {
if(ds[i] + ct + dt[nd] == ds[T]) G1[i].push_back(nd);
if(dt[i] + ct + ds[nd] == ds[T]) G2[i].push_back(nd);
}
}
ans = dv[U];
vector <int> ord(N);
BU.assign(N + 1, 0);
BV.assign(N + 1, 0);
iota(ord.begin(), ord.end(), 1);
sort(ord.begin(), ord.end(), cmp1);
for(int i = 1; i <= N; i++) {
BU[i] = du[i];
BV[i] = dv[i];
}
for(int i = 0; i < N; i++) {
int inx = ord[i];
for(auto to : G1[inx]) {
BU[to] = min(BU[inx], BU[to]);
BV[to] = min(BV[inx], BV[to]);
}
ans = min(ans, BU[inx] + dv[inx]);
ans = min(ans, BV[inx] + du[inx]);
}
cout << ans << endl;
return 0;
}