#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
typedef pair<int, int> pii;
typedef pair<lli, int> pli;
typedef tuple<lli, int, int> tli;
const int maxn = 1e5+10;
const lli inf = 1e18+10;
int N, M, S, T, U, V;
lli ans = inf;
lli du[maxn], dv[maxn], ds[maxn], dp[2][maxn];
bool mark[maxn];
vector<pii> graph[maxn];
void djk1(int x, lli arr[]){
memset(mark, 0, sizeof(mark));
for(int i=1; i<=N; i++) arr[i] = inf;
arr[x] = 0;
priority_queue<pli, vector<pli>, greater<pli>> pq;
pq.push({0, x});
while(!pq.empty()){
auto[d, u] = pq.top(); pq.pop();
if(mark[u]) continue;
mark[u] = true;
for(auto [v, w] : graph[u]){
if(!mark[v]){
arr[v] = min(arr[v], arr[u]+w);
pq.push({arr[v], v});
}
}
}
}
void djk2(int start, int end){
for(int i=0; i<=N; i++) {dp[0][i] = inf; dp[1][i]=inf;}
memset(mark, 0, sizeof(mark));
priority_queue<tli, vector<tli>, greater<tli>> pq;
pq.push({0, start, 0});
while(!pq.empty()){
auto[d, u, par] = pq.top(); pq.pop();
if(!mark[u]){
mark[u] = true;
ds[u] = d;
dp[0][u] = min(du[u], dp[0][par]);
dp[1][u] = min(dp[0][u] + dv[u], dp[1][par]);
for(auto [v, w] : graph[u]) pq.push({d+w, v, u});
}
else if(d==ds[u]){
dp[0][u] = min(dp[0][u], dp[0][par]);
dp[1][u] = min({dp[1][u], dp[1][par], dp[0][u] + dv[u]});
}
}
ans = min(ans, dp[1][end]);
}
int main() {
cin >> N >> M >> S >> T >> U >> V;
for(int i=0; i<M; i++){
int A, B, C; cin >> A >> B >> C;
graph[A].push_back({B, C});
graph[B].push_back({A, C});
}
djk1(U, du);
djk1(V, dv);
ans = du[V];
djk2(S, T);
djk2(T, S);
cout << ans << "\n";
}