#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll c,p,pb,pa1,pa2;
ll dis[2001000],vis[2001000],head[2000100],num;
ll dis2[2001000],vis2[2001000];
ll ans,ans1,ans2,ans3;
struct node{
int u,v,w;
}a[200100];
void add(int from,int to,int dis){
num++;
a[num].u=head[from];
a[num].v=to;
a[num].w=dis;
head[from]=num;
}
void spfa1(){
queue<int> q;
for(int i=1;i<=p;i++){
dis[i]=0x3f3f3f;
vis[i]=0;
}
q.push(pb);
dis[pb]=0;
while(!q.empty()){
int yy=q.front();
q.pop();
vis[yy]=0;
for(int i=head[yy];i;i=a[i].u){
int vv=a[i].v;
if(dis[vv]>dis[yy]+a[i].w){
dis[vv]=dis[yy]+a[i].w;
if(vis[i]==0){
vis[i]=1;
q.push(vv);
}
}
}
}
}
void spfa2(){
queue<int> q1;
for(int i=1;i<=p;i++){
dis2[i]=0x3f3f3f;
vis2[i]=0;
}
q1.push(pa1);
dis2[pa1]=0;
while(!q1.empty()){
int yy=q1.front();
q1.pop();
vis2[yy]=0;
for(int i=head[yy];i;i=a[i].u){
int vv=a[i].v;
if(dis2[vv]>dis2[yy]+a[i].w){
dis2[vv]=dis2[yy]+a[i].w;
if(vis2[i]==0){
vis2[i]=1;
q1.push(vv);
}
}
}
}
}
int main() {
cin>>c>>p;
cin>>pb>>pa1>>pa2;
for(int i=1;i<=c;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
spfa1();
ans1=dis[pa1];
ans2=dis[pa2];
ans=min(ans1,ans2);
spfa2();
ans3=dis2[pa2];
ans+=ans3;
cout<<ans;
return 0;
}