#include<bits/stdc++.h>
#define N 6505
#define f1(i,n,m) for(int i=n;i<=m;++i)
#define f2(i,n,m) for(int i=n;i>=m;--i)
#define max(a,b) (a>b?a:b)
#define reset(a,b) memset(a,b,sizeof(a))
#define M 0x3f3f3f
using namespace std;
template <typename T>
void read(T &x){
int w=1;x=0;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
x*=w;
}
int head[N*N*2],nex[N*N*2],to[N*N*2],w[N*N*2],from[N*N*2],dis[10][N],pi[N*N*2];
int n,m,s1,s2,ed1,ed2,tot=1;
bool vis[N];
struct edge{
int to,id;
};
vector<edge>e[N];
struct node{
int d,id;
bool operator<(const node& a) const {
return a.d<d;
}
};
void add(int x,int y,int wi){
to[++tot]=y;
from[tot]=x;
w[tot]=wi;
nex[tot]=head[x];
head[x]=tot;
}
void dij(int s,int *dis){//最短路
priority_queue<node>q;
int x,y;
f1(i,1,n)dis[i]=M;
reset(vis,0);
dis[s]=0;
q.push(node{0,s});
while(!q.empty()){
x=q.top().id;
q.pop();
for(int i=head[x];i;i=nex[i]){
y=to[i];
if(dis[y]>dis[x]+w[i]){
dis[y]=dis[x]+w[i];
if(!vis[y])q.push(node{dis[y],y});
}
}
}
}
void dij2(int s,int *dis){//最长路
priority_queue<node>q;
int x,y,i;
f1(i,1,n)dis[i]=M;
reset(vis,0);
dis[s]=0;
q.push(node{0,s});
while(!q.empty()){
x=q.top().id;
q.pop();
vis[x]=0;
for(auto v:e[x]){
i=v.id,y=v.to;
if(pi[i]<3)continue;
if(dis[y]>dis[x]-(pi[i]+pi[i^1]==5? 1:0)*w[i]){
dis[y]=dis[x]-(pi[i]+pi[i^1]==5? 1:0)*w[i];
if(!vis[y])q.push(node{dis[y],y}),vis[y]=1;
}
}
}
}
void work(int *d1,int *d2,int t){
f1(i,2,m*2+1)if(d1[from[i]]+d2[to[i]]+w[i]==d1[t]){
if(t==ed1)pi[i]+=2;
else if(t==ed2)pi[i]+=3;
e[from[i]].push_back(edge{to[i],i});
}
}
signed main(){
int x,y,wi;
read(n),read(m);
read(s1),read(ed1),read(s2),read(ed2);
f1(i,1,m){
read(x),read(y),read(wi);
add(x,y,wi);
add(y,x,wi);
}
dij(s1,dis[1]);dij(ed1,dis[2]);
dij(s2,dis[3]);dij(ed2,dis[4]);
work(dis[1],dis[2],ed1);
work(dis[3],dis[4],ed2);
f1(i,1,m*2+1)
// if(pi[i])cout<<" "<<from[i]<<" "<<to[i]<<endl;
// cout<<dis[1][from[9]]+w[9]+dis[2][to[9]];
// cout<<from[9]<<" "<<to[9];
dij2(s2,dis[5]);
// f1(i,1,n)cout<<dis[1][i]<<" ";
cout<<-dis[5][ed2];
}