#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, vector<int>> tli;
const int maxn = 1e5+10;
const lli inf = 1e18+10;
int N, M, S, T, U, V;
lli dist[maxn];
lli dist2[maxn];
vector<pii> graph[maxn];
void djk2(vector<int> free_graph[]){
for(int i=1; i<=N; i++) dist2[i] = inf;
dist2[U] = 0;
priority_queue<pli, vector<pli>, greater<pli>> pq;
pq.push({0, U});
while(!pq.empty()){
auto[d, u] = pq.top(); pq.pop();
if(dist2[u] < d) continue;
for(auto v : free_graph[u]){
if(dist2[v] > dist2[u]){
dist2[v] = dist2[u];
pq.push({dist2[v], v});
}
}
for(auto [v, w] : graph[u]){
if(dist2[v] > dist2[u]+w){
dist2[v] = dist2[u]+w;
pq.push({dist2[v], v});
}
}
}
}
lli djk1(){
for(int i=1; i<=N; i++) dist[i] = inf;
dist[S] = 0;
priority_queue<tli, vector<tli>, greater<tli>> pq;
pq.push({0, S, {}});
lli ans=inf;
while(!pq.empty()){
auto[d, u, r] = pq.top(); pq.pop();
vector<int> aux = r;
aux.push_back(u);
if(dist[u] < d) continue;
if(u==T){
vector<int> f_graph[maxn];
for(int i=1; i<(int)aux.size(); i++){
int A = aux[i], B=aux[i-1];
f_graph[A].push_back(B);
f_graph[B].push_back(A);
}
djk2(f_graph);
ans = min(ans, dist2[V]);
}
for(auto [v, w] : graph[u]){
if(dist[v] >= dist[u]+w){
dist[v] = dist[u]+w;
pq.push({dist[v], v, aux});
}
}
}
return ans;
}
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});
}
cout << djk1() << "\n";
}