#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int Nm=1502;
struct Edg{
int v,w;
}el[Nm*Nm],el2[Nm*Nm];
int n,te=0,head[Nm],vis[Nm],nxt[Nm*Nm];
int head2[Nm],nxt2[Nm*Nm],in[Nm],len[Nm];
int dis[5][Nm];
struct node{
int p,d;
friend bool operator < (node a,node b){
return a.d>b.d;
}
}now,tn;
void dij(int x,int s){
int t;
priority_queue<node>AA;
memset(vis,0,sizeof(vis));
tn.p=s;
tn.d=0;
AA.push(tn);
while(!AA.empty()){
now=AA.top();
AA.pop();
if(vis[now.p]==1)continue;
vis[now.p]=1;
dis[x][now.p]=now.d;
t=head[now.p];
while(t>0){
if(vis[el[t].v]==0){
tn.p=el[t].v;
tn.d=now.d+el[t].w;
AA.push(tn);
}
t=nxt[t];
}
}
return;
}
void add_edge(int x,int y,int w){
te++;
el[te].v=y;
nxt[te]=head[x];
el[te].w=w;
head[x]=te;
return;
}
int topo(){
int lmax=0;
queue<int>AA;
for(int i=1;i<=n;i++){
if(in[i]==0)AA.push(i);
}
int no,tt;
while(!AA.empty()){
no=AA.front();
AA.pop();
lmax=max(lmax,len[no]);
tt=head2[no];
while(tt>0){
len[el2[tt].v]=max(len[el2[tt].v],len[no]+el2[tt].w);
in[el2[tt].v]--;
if(in[el2[tt].v]==0){
AA.push(el2[tt].v);
}
tt=nxt[tt];
}
}
return lmax;
}
int main(){
int m,x1,y1,x2,y2,t;
cin>>n>>m;
cin>>x1>>y1>>x2>>y2;
int u,v,w;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
}
memset(dis,0x3f,sizeof(dis));
dij(1,x1);
dij(2,y1);
dij(3,x2);
dij(4,y2);
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=head[i];j>0;j=nxt[j]){
if(dis[1][i]+el[j].w+dis[2][el[j].v]==dis[1][y1]){
if(dis[3][i]+el[j].w+dis[4][el[j].v]==dis[3][y2]){
cnt++;
el2[cnt].v=el[j].v;
el2[cnt].w=el[j].w;
nxt2[cnt]=head2[i];
head2[i]=cnt;
in[el[j].v]++;
}
}
}
}
int ans=topo();
memset(el2,0,sizeof(el2));
memset(head2,0,sizeof(head2));
memset(nxt2,0,sizeof(nxt2));
memset(len,0,sizeof(len));
memset(in,0,sizeof(in));
cnt=0;
for(int i=1;i<=n;i++){
for(int j=head[i];j>0;j=nxt[j]){
if(dis[1][i]+el[j].w+dis[2][el[j].v]==dis[1][y1]){
if(dis[4][i]+el[j].w+dis[3][el[j].v]==dis[3][y2]){
cnt++;
el2[cnt].v=el[j].v;
el2[cnt].w=el[j].w;
nxt2[cnt]=head2[i];
head2[i]=cnt;
in[el[j].v]++;
}
}
}
}
cout<<max(ans,topo());
return 0;
}