#include <bits/stdc++.h>
using namespace std;
struct Node
{
int id,reach;
};
priority_queue <Node> q;
int n,m,s,dis[1505],dis1[1505],dis2[1505],dis3[1505],dis4[1505];
int a1,a2,b1,b2,d[1505],num[1505];
vector <int> v[1505],w[1505],v1[1505],w1[1505];
bool vis[1505];
bool operator <(const Node x,const Node y)
{
return x.reach>y.reach;
}
void dijkstra()
{
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push({s,0});
while (!q.empty())
{
Node t=q.top();
q.pop();
if (vis[t.id])
{
continue;
}
vis[t.id]=true;
for (int i=0;i<v[t.id].size();i++)
{
int tt=v[t.id][i];
if (dis[tt]>dis[t.id]+w[t.id][i])
{
dis[tt]=dis[t.id]+w[t.id][i];
q.push({tt,dis[tt]});
}
}
}
for (int i=1;i<=n;i++)
{
vis[i]=false;
}
}
void L()
{
s=a1;
dijkstra();
for (int i=1;i<=n;i++)
{
dis1[i]=dis[i];
}
s=b1;
dijkstra();
for (int i=1;i<=n;i++)
{
dis2[i]=dis[i];
}
s=a2;
dijkstra();
for (int i=1;i<=n;i++)
{
dis3[i]=dis[i];
}
s=b2;
dijkstra();
for (int i=1;i<=n;i++)
{
dis4[i]=dis[i];
}
}
int topsort()
{
queue<int> q;
for (int i=1;i<=n;i++)
{
if (d[i]==0)
{
q.push(i);
}
}
int maxn=0;
while (!q.empty())
{
int f=q.front();
q.pop();
for (int i=0;i<v1[f].size();i++)
{
int t=v1[f][i];
d[t]--;
num[t]=max(num[t],num[f]+w1[f][i]);
maxn=max(maxn,num[t]);
if (d[t]==0)
{
q.push(t);
}
}
}
return maxn;
}
int main()
{
cin>>n>>m;
cin>>a1>>b1>>a2>>b2;
for (int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
v[x].push_back(y);
w[x].push_back(z);
v[y].push_back(x);
w[y].push_back(z);
}
L();
for (int i=1;i<=n;i++)
{
for (int j=0;j<v[i].size();j++)
{
int fr=i,to=v[i][j];
if (dis1[fr]+w[i][j]+dis2[to]==dis1[b1])
{
if (dis3[fr]+w[i][j]+dis4[to]==dis3[b2]||dis4[fr]+w[i][j]+dis3[to]==dis4[a2])
{
v1[fr].push_back(to);
w1[fr].push_back(w[i][j]);
d[to]++;
}
}
}
}
cout<<topsort();
return 0;
}