#include <bits/stdc++.h>
using namespace std;
void Init()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
typedef long long ll;
typedef pair<ll,ll> pii;
int n,m;
const int maxn=1e5+5;
int S,T,U,V;
vector<pii> g[maxn];
vector<int> dag[maxn];
ll ds[maxn],dt[maxn],du[maxn],dv[maxn];
ll best[maxn];
bool onPath[maxn];
void Input()
{
cin>>n>>m;
cin>>S>>T>>U>>V;
for (int i=1;i<=m;i++)
{
ll u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
}
void dijk(ll d[],int s)
{
priority_queue<pii,vector<pii>,greater<pii>> pq;
for (int i=1;i<=n;i++)
d[i]=(ll)4e18;
d[s]=0;
pq.push({0,s});
while (!pq.empty())
{
ll dist=pq.top().first;
int u=pq.top().second;
pq.pop();
if (dist>d[u]) continue;
for (int i=0;i<g[u].size();i++)
{
int v=g[u][i].first;
ll w=g[u][i].second;
if (d[v]>dist+w)
{
d[v]=dist+w;
pq.push({d[v],v});
}
}
}
}
bool cmp(int a,int b)
{
return ds[a]<ds[b];
}
void Bai()
{
dijk(ds,S);
dijk(dt,T);
dijk(du,U);
dijk(dv,V);
for (int u=1;u<=n;u++)
{
for (int i=0;i<g[u].size();i++)
{
int v=g[u][i].first;
ll w=g[u][i].second;
if (ds[u]+w==ds[v])
dag[u].push_back(v);
}
}
for (int i=1;i<=n;i++)
{
if (ds[i]+dt[i]==ds[T])
onPath[i]=1;
else
onPath[i]=0;
}
vector<int> ord;
for (int i=1;i<=n;i++)
ord.push_back(i);
sort(ord.begin(),ord.end(),cmp);
for (int i=1;i<=n;i++)
best[i]=(ll)4e18;
for (int i=0;i<n;i++)
{
int u=ord[i];
if (onPath[u])
best[u]=min(best[u],du[u]);
for (int j=0;j<dag[u].size();j++)
{
int v=dag[u][j];
best[v]=min(best[v],best[u]);
}
}
ll ans=du[V];
for (int i=1;i<=n;i++)
if (onPath[i])
ans=min(ans,best[i]+dv[i]);
cout<<ans;
}
int main()
{
Init();
Input();
Bai();
return 0;
}