#define N 1505
#define ll long long
#define maxx 0x3f3f3f3f
using namespace std;
int n,m,ans=0;
int x1,x2,yy,y2;
int head[N],nex[N*N],to[N*N],e[N*N],tot=1;
int head2[N],nex2[N*N],to2[N*N],e2[N*N],tot2=1;
void add1(int x,int y,int z){
int k=head[x];
head[x]=tot;
to[tot]=y;
nex[tot]=k;
e[tot]=z;
tot++;
}
int ru[N];
void add2(int x,int y,int z){
ru[y]++;
int k=head2[x];
head2[x]=tot2;
to2[tot2]=y;
nex2[tot2]=k;
e2[tot2]=z;
tot2++;
}
int dis[5][N];
bool vis[N];
struct node{
int dis,id;
bool operator < (const node &b) const{
return dis>b.dis;
}
};
priority_queue<node> q;
void dijk(int num,int s){
memset(dis[num],maxx,sizeof(dis[num]));
memset(vis,0,sizeof(vis));
dis[num][s]=0;
vis[s]=1;
q.push({0,s});
while(!q.empty()){
int u=q.top().id;
q.pop();
for(int k=head[u];k;k=nex[k]){
int v=to[k],w=e[k];
if(dis[num][v]>dis[num][u]+w){
dis[num][v]=dis[num][u]+w;
if(!vis[v]) vis[v]=1,q.push({dis[num][v],v});
}
}
}
}
int l[N],que[N],h,la;
int q_pop(){
return que[h++];
}
void q_push(int x){
que[la++]=x;
}
void topo(){
h=0;
la=0;
memset(l,0,sizeof(l));
for(int i=1;i<=n;i++){
if(ru[i]==0) q_push(i);
}
while(h<la){
int u=q_pop();
// cout<<" "<<u<<" "<<l[u]<<endl;
for(int k=head2[u];k;k=nex2[k]){
int v=to2[k],w=e2[k];
l[v]=max(l[v],l[u]+w);
ru[v]--;
if(ru[v]==0) q_push(v);
}
}
}
int main(){
cin>>n>>m;
cin>>x1>>yy>>x2>>y2;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
add1(u,v,w);
add1(v,u,w);
}
dijk(1,x1);
dijk(2,yy);
dijk(3,x2);
dijk(4,y2);
int len1=dis[1][yy],len2=dis[3][y2];
for(int u=1;u<=n;u++){
for(int k=head[u];k;k=nex[k]){
int v=to[k],w=e[k];
if(dis[1][u]+w+dis[2][v]==len1&&dis[3][u]+w+dis[4][v]==len2) add2(u,v,w);
}
}
topo();
for(int i=1;i<=n;i++) ans=max(ans,l[i]);
memset(head2,0,sizeof(head2));
memset(nex2,0,sizeof(nex2));
memset(ru,0,sizeof(ru));
tot2=1;
for(int u=1;u<=n;u++){
for(int k=head[u];k;k=nex[k]){
int v=to[k],w=e[k];
if(dis[1][u]+w+dis[2][v]==len1&&dis[4][u]+w+dis[3][v]==len2) add2(u,v,w);
}
}
topo();
for(int i=1;i<=n;i++) ans=max(ans,l[i]);
cout<<ans<<endl;
return 0;
}