#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long ll;
ll dis[N],dis1[N],dis2[N],inf=1e18,len[N];
int n,nxt[N],head[N],to[N],ecnt=1;
void add_edge(int u,int v,int w) {nxt[++ecnt]=head[u];to[ecnt]=v;len[ecnt]=w;head[u]=ecnt;}
struct node {
int p;ll w;
bool operator<(const node &u) const{return w>u.w;}
};
priority_queue<node> Q;
void DJ1(int s) {
memset(dis1,0x3f,sizeof(dis1));
Q.push((node){s,0});
dis1[s]=0;
while(!Q.empty()) {
int u=Q.top().p; Q.pop();
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(dis1[v]>dis1[u]+len[i]) {
dis1[v]=dis1[u]+len[i];
Q.push((node){v,dis1[v]});
}
}
}
}
void DJ2(int s) {
memset(dis2,0x3f,sizeof(dis2));
Q.push((node){s,0});
dis2[s]=0;
while(!Q.empty()) {
int u=Q.top().p; Q.pop();
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(dis2[v]>dis2[u]+len[i]) {
dis2[v]=dis2[u]+len[i];
Q.push((node){v,dis2[v]});
}
}
}
}
void DJ(int s) {
memset(dis,0x3f,sizeof(dis));
Q.push((node){s,0});
dis[s]=0;
while(!Q.empty()) {
int u=Q.top().p; Q.pop();
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(dis[v]>dis[u]+len[i]) {
dis[v]=dis[u]+len[i];
Q.push((node){v,dis[v]});
}
}
}
}
int main() {
int m,S,T,U,V;
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&S,&T,&U,&V);
for(int i=1;i<=m;i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w),add_edge(v,u,w);
}
DJ1(S),DJ2(T);
ll D=dis1[T];
for(int u=1;u<=n;u++) {
for(int j=head[u];j;j=nxt[j]) {
int v=to[j];
if(dis1[u]+len[j]+dis2[v]==D) len[j]=0;
}
}
DJ(U);
ll ans=dis[V];
for(int u=1;u<=n;u++) {
for(int j=head[u];j;j=nxt[j]) {
int v=to[j];
if(dis1[v]+len[j]+dis2[u]==D) len[j^1]=len[j],len[j]=0;
}
}
DJ(U);
ans=min(ans,dis[V]);
printf("%lld",ans);
return 0;
}