#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using ll=long long;
using pli=pair<ll,int>;
const int N=1e5+5;
const ll INF=1e18;
vector<pair<int,ll>> adj[N];
ll dist[N],past[N],dist_U=INF,dist_V=INF;
bool sp[N];
int n,m,S,T,U,V;
int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>m>>S>>T>>U>>V;
for(int i=0;i<m;i++){
int u,v; ll w; cin>>u>>v>>w;
adj[u].push_back({v,w});
adj[v].push_back({u,w});
}
//dstra S->T
for(int i=1;i<=n;i++){
dist[i]=INF;
}
priority_queue<pli,vector<pli>,greater<pli>> pq;
dist[S]=0; past[S]=-1; pq.push({dist[S],S});
while(!pq.empty())
{
auto [d,u]=pq.top(); pq.pop();
if(d!=dist[u]) continue;
for(auto [v,w]:adj[u]){
if(dist[u]+w<dist[v]){
dist[v]=dist[u]+w;
past[v]=u;
pq.push({dist[v],v});
}
}
}
int cur=T;
while(cur!=-1){
sp[cur]=true;
cur=past[cur];
}
//dstra from U
for(int i=1;i<=n;i++){ dist[i]=INF; past[i]=0; }
dist[U]=0; past[U]=-1; pq.push({dist[U],U});
while(!pq.empty())
{
auto [d,u]=pq.top(); pq.pop();
if(d!=dist[u]) continue;
if(sp[u]){
dist_U=min(dist_U,d);
//continue;
}
for(auto [v,w]:adj[u]){
if(dist[u]+w<dist[v]){
dist[v]=dist[u]+w;
past[v]=u;
pq.push({dist[v],v});
}
}
}
cur=V; bool has_sp=false;
while(cur!=-1){
if(sp[cur]){
has_sp=true; break;
}
cur=past[cur];
}
if(!has_sp) {cout<<dist[V]<<endl; return 0;}
//dstra from V
for(int i=1;i<=n;i++) dist[i]=INF;
dist[V]=0; pq.push({dist[V],V});
while(!pq.empty())
{
auto [d,u]=pq.top(); pq.pop();
if(d!=dist[u]) continue;
if(sp[u]){
dist_V=min(dist_V,d);
//continue;
}
for(auto [v,w]:adj[u]){
if(dist[u]+w<dist[v]){
dist[v]=dist[u]+w;
pq.push({dist[v],v});
}
}
}
cout<<dist_U+dist_V<<endl;
//cout<<"has sp"<<endl;
}