#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int N = 2e5 + 5;
vector<pair<int,ll>> adj[N];
int n;
vector<ll> dijk(int src){
vector<ll> dis(n+1,1e18);
priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<>> q;
q.push({0,src});
dis[src] = 0;
while(q.size()){
auto [cost,node] = q.top(); q.pop();
if(cost > dis[node]) continue;
for(auto [ch,c] : adj[node]){
if(cost + c >= dis[ch]) continue;
dis[ch] = cost + c;
q.push({cost+c,ch});
}
}
return dis;
}
void solve(){
int m;
int s,t,u,v;
cin>>n>>m>>s>>t>>u>>v;
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
adj[a].push_back({b,c});
adj[b].push_back({a,c});
}
vector<ll> d1 = dijk(u);
vector<ll> d2 = dijk(v);
priority_queue<array<ll,4>,vector<array<ll,4>>,greater<>> q;
vector<vector<pair<ll,ll>>> dis(n+1,vector<pair<ll,ll>>(4,{1e18,1e18}));
q.push({0,0,s,3});
dis[s][3] = {0,0};
while(q.size()){
auto [c1,c2,node,tp] = q.top(); q.pop();
if(make_pair(c1,c2) > dis[node][tp]) continue;
for(auto [ch,c] : adj[node]){
if(make_pair(c1+c,c2) >= dis[ch][tp]) continue;
q.push({c1+c,c2,ch,tp});
dis[ch][tp] = {c1+c,c2};
}
if(tp&1){
if(make_pair(c1,c2+d1[node]) < dis[node][tp^1]){
q.push({c1,c2+d1[node],node,tp^1});
dis[node][tp^1] = {c1,c2+d1[node]};
}
}
if(tp&2){
if(make_pair(c1,c2+d2[node]) < dis[node][tp^2]){
q.push({c1,c2+d2[node],node,tp^2});
dis[node][tp^2] = {c1,c2+d2[node]};
}
}
}
cout<<min(d1[v],dis[t][0].second)<<endl;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}