#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=200001;
int fst[MAXN<<1],nxt[MAXN<<1],dis[MAXN];
int sx,sy,n,m,tot;
struct hh {int f,t,c;}ma[MAXN<<1];
struct edge {int num,d;};
bool operator < (edge a,edge b) {return a.d>b.d;}
priority_queue<edge>q;
void build(int f,int t,int c)
{
ma[++tot]=(hh){f,t,c};
nxt[tot]=fst[f];
fst[f]=tot;
return;
}
void Dijkstra()
{
memset(dis,0x7f,sizeof(dis));
dis[sx]=0,q.push((edge){sx,0});
while(!q.empty())
{
int x=q.top().num;
q.pop();
for(int i=fst[x];i;i=nxt[i])
{
int v=ma[i].t;
if(dis[v]>dis[x]+ma[i].c)
{
dis[v]=dis[x]+ma[i].c;
q.push((edge){v,dis[v]});
}
}
}
return;
}
void solve()
{
cin>>n>>m>>sx>>sy;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
build(x,y,z),build(y,x,z);
}
Dijkstra();
cout<<dis[sy];
return;
}
int main()
{
solve();
return 0;
}