#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int n,m,es,et,num,head[2510],dis[2510];
bool flag[2510];
queue<int>q;
struct node
{
int to,nxt,v;
}edge[7000*2];
int spfa(int s,int t)
{
q.push(s);
flag[s]=1;
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
while(!q.empty())
{
int x=q.front();
for(int i=head[x];i;i=edge[i].nxt)
{
if(edge[i].v+dis[x]<dis[edge[i].to])
{
dis[edge[i].to]=edge[i].v+dis[x];
if(flag[edge[i].to]==0)
{
q.push(edge[i].to);
flag[edge[i].to]=1;
}
}
}
flag[x]=0;
q.pop();
}
return dis[t];
}
void puit(int from,int to,int v)
{
edge[++num].nxt=head[from];
edge[num].to=to;
edge[num].v=v;
head[from]=num;
}
int main()
{
cin>>n>>m>>es>>et;
int from,to,v;
for(int i=1;i<=m;i++)
{cin>>from>>to>>v;
puit(from,to,v);puit(to,from,v);}
cout<<spfa(es,et);
return 0;
}