code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef long double ld;
const ll maxn=1500+2;
inline ll read_int(){
ll a=0;bool f=0;char g=getchar();
while(g<'0'||g>'9') {if(g=='-') f=1;g=getchar();}
while('0'<=g&&g<='9') a=a*10+g-'0',g=getchar();
return f ? -a : a;
}
inline void write(ll a,bool f=1){
char lin[40];ll top=0;
if(a<0) a=-a,putchar('-');
while(a) lin[++top]=a%10+'0',a/=10;
if(!top) lin[++top]='0';
while(top) putchar(lin[top--]);
if(f) putchar('\n');
}
struct E{
int t,n,v;
}edge[300000*2+32];
int l,head[maxn];
int n,m;
int X1,X2,Y1,Y2;
int dis[maxn];
inline void djsl(int s){
memset(dis,0x3f,sizeof dis);
dis[s]=0;
priority_queue<pii> p;
p.push({0,s});
while(!p.empty()){
int s=p.top().second;
if(p.top().first+dis[s]) {p.pop();continue;}
else p.pop();
for(int i=head[s];i;i=edge[i].n){
int t=edge[i].t;
if(dis[t]>dis[s]+edge[i].v){
dis[t]=dis[s]+edge[i].v;
p.push({-dis[t],t});
}
}
}
}
int du[maxn];bool vis[maxn];
inline void dfs_1(int s){
if(vis[s]) return;
vis[s]=1;
for(int i=head[s];i;i=edge[i].n){
int t=edge[i].t;
if(dis[s]==dis[t]+edge[i].v){
du[t]++;
dfs_1(t);
}
}
}
int Dis[maxn][maxn];
inline void dfs_2(int s){
for(int i=head[s];i;i=edge[i].n){
int t=edge[i].t;
if(dis[s]==dis[t]+edge[i].v){
du[t]--;
for(int e=1;e<=n;e++){
if(e==t) continue;
if(s==e) Dis[s][t]=edge[i].v;
else if(Dis[e][s]) Dis[e][t]=Dis[e][s]+edge[i].v;
}
if(du[t]) continue;
dfs_2(t);
}
}
}
bool can[maxn][maxn];
int ans=0;
inline void dfs_3(int s){
for(int i=1;i<=n;i++){
if(can[i][s]) ans=max(max(Dis[s][i],Dis[i][s]),ans);
}
for(int i=head[s];i;i=edge[i].n){
int t=edge[i].t;
if(dis[s]==dis[t]+edge[i].v){
du[t]--;
for(int e=1;e<=n;e++){
if(e==t) continue;
if(s==e) can[s][t]=1;
else if(can[e][s]) can[e][t]=1;
}
if(du[t]) continue;
dfs_3(t);
}
}
}
inline void read(){
n=read_int(),m=read_int();
X1=read_int(),Y1=read_int(),X2=read_int(),Y2=read_int();
for(int i=1;i<=m;i++){
int f=read_int(),t=read_int(),v=read_int();
l++,edge[l]=(E){t,head[f],v},head[f]=l;
l++,edge[l]=(E){f,head[t],v},head[t]=l;
}
djsl(X1);
dfs_1(Y1);
for(int i=1;i<=n;i++) vis[i]=0;
dfs_2(Y1);
djsl(X2);
for(int i=1;i<=n;i++) vis[i]=0;
dfs_1(Y2);
dfs_3(Y2);
write(ans);
}
int main (){
read();
}