#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
#include<queue>
const int ni=6e6;
void topsort();
int h[ni],e[ni],ne[ni],st[ni];
struct node{int i;long long d;};
bool operator<(node a,node b);
int idx,n,m,s1,s2,t1,t2,du[ni];
long long dis[5][ni],w[ni],ans,f[ni];
void add(int a,int b,long long c);
vector<node>touch[2000];
void solve(),dijkstra(int a,long long b[]);
int main(){solve();return 0;}
void solve(){
scanf("%d%d%d",&n,&m,&s1);
scanf("%d%d%d",&t1,&s2,&t2);
memset(h,-1,sizeof(h));
for(int i=1;i<=m;i++){
int a,b;long long c;
scanf("%d%d%lld",&a,&b,&c);
add(a,b,c);add(b,a,c);
}
dijkstra(s1,dis[1]);
dijkstra(s2,dis[3]);
dijkstra(t1,dis[2]);
dijkstra(t2,dis[4]);
for(int i=1;i<=n;i++)
for(int j=h[i];j!=-1;j=ne[j]){
int k=e[j];
if(dis[1][i]+w[j]+dis[2][k]==dis[1][t1])
if(dis[3][i]+w[j]+dis[4][k]==dis[3][t2])
touch[i].push_back((node){k,w[j]}),du[k]++;
}
topsort();
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++){
touch[i].clear();
for(int j=h[i];j!=-1;j=ne[j]){
int k=e[j];
if(dis[1][i]+w[j]+dis[2][k]==dis[1][t1])
if(dis[4][i]+w[j]+dis[3][k]==dis[3][t2])
touch[i].push_back((node){k,w[j]}),du[k]++;
}
}
topsort();
printf("%lld",ans);
}
void topsort(){
queue<int>q;
for(int i=1;i<=n;i++)if(!du[i])q.push(i);
while(q.size()){
int t=q.front();
q.pop();ans=max(f[t],ans);
for(node i:touch[t]){
int j=i.i;long long wi=i.d;
f[j]=max(f[j],f[t]+wi);
if(--du[j]==0)q.push(j);
}
}
}
void dijkstra(int si,long long dist[]){
priority_queue<node>q;
memset(st,0,sizeof(st));
fill(dist+1,dist+1+n,1e18);
dist[si]=0;q.push((node){si,dist[si]});
while(q.size()){
int t=q.top().i;q.pop();
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>dist[t]+w[i]){
dist[j]=dist[t]+w[i];
if(st[j]==0)st[j]=1,
q.push((node){j,dist[j]});
}
}
}
}
void add(int a,int b,long long c){
e[idx]=b;w[idx]=c;
ne[idx]=h[a];h[a]=idx++;
}
bool operator<(node a,node b)
{return a.d>b.d;}