#include<stdio.h>
#define N 30002
struct nod{ long inf,dist;nod *urm;};
nod *paux,*prim[N];
int n,m,x,y,p,q,di,i,solved,d[N],t,b,co[N],viz[N],act;
void readd(),solve(),pune(int mic,int mare,int dis),bfs();
int main()
{
readd();
solve();
return 0;
}
void readd()
{
freopen("sate.in","r",stdin);
freopen("sate.out","w",stdout);
scanf("%d%ld%d%d",&n,&m,&x,&y);
if(x==y){solved=1;printf("0\n");return;}
if(x>y){p=x;x=y;y=p;}
for(i=1;i<=m;i++)
{ scanf("%d%d%d",&p,&q,&di);
if(p<q)pune(p,q,di);
else pune(q,p,di);
}
}
void solve()
{ if(solved)return;
bfs();
printf("%d",d[y]);
}
void pune(int mic,int mare,int dis)
{
paux=new nod;
paux->inf=mare;
paux->dist=dis;
paux->urm=(prim[mic])?prim[mic]:0;
prim[mic]=paux;
paux=new nod;
paux->inf=mic;
paux->dist=-dis;
paux->urm=(prim[mare])?prim[mare]:0;
prim[mare]=paux;
}
void bfs()
{
t=b=1;
co[t]=x;viz[x]=1;
while(t<=b)
{ act=co[b];
for(paux=prim[act];paux;paux=paux->urm)
{ if(viz[paux->inf])continue;
d[paux->inf]=d[act]+paux->dist;
if(paux->inf==y)return;
t++;
co[t]=paux->inf;
viz[paux->inf]=1;
}
b++;
}
}