#include<cstdio>
#define N 30001
typedef struct nod
{int info,cost;
struct nod *next;}Nod;
struct P
{int a,b;};
P s[N];
Nod *l[N],*t;
int i,n,m,x,y,j,p,u,c[N],k,o;
void A(int i,int j,int k)
{Nod *p=new Nod;
p->info=j;
p->cost=k;
p->next=l[i];
l[i]=p;}
int B(int i,int j)
{Nod *p;
for(p=l[i];p;p=p->next)
if(p->info==j)
return p->cost;
return 0;}
int main()
{FILE *f=fopen("sate.in","r"),*g=fopen("sate.out","w");
fscanf(f,"%d%d%d%d",&n,&m,&x,&y),c[x]=1;
while(m--)
fscanf(f,"%d%d%d",&i,&j,&k),A(i,j,k);
for(t=l[x];t;t=t->next)
if(t->info>x)
s[u].a=x,s[u].b=t->info,u++;
else
s[u].a=t->info,s[u].b=x,u++;
while(p<=u)
{i=s[p].a,j=s[p].b,p++;
if(!c[i])
{c[i]=1;
for(t=l[i];t;t=t->next)
if(!c[t->info]&&!B(k,j)&&!B(j,k))
{k=t->info;
if(k<j)
{s[u].a=k,s[u].b=j,u++;
if(k<i)
A(k,j,B(i,j)+B(k,i));
else
A(k,j,B(i,j)-B(i,k));}
else
s[u].a=j,s[u].b=k,u++,A(j,k,B(i,k)-B(i,j));}}
else
if(!c[j])
{c[j]=1;
for(t=l[j];t;t=t->next)
if(!c[t->info]&&!B(i,k)&&!B(k,i))
{k=t->info;
if(k>i)
{s[u].a=i,s[u].b=k,u++;
if(k<j)
A(i,k,B(i,j)-B(k,j));
else
A(i,k,B(i,j)+B(j,k));}
else
s[u].a=k,s[u].b=i,u++,A(k,i,B(k,j)-B(i,j));}}
else
break;}
fprintf(g,"%d",B(x,y));
return 0;}