#include <bits/stdc++.h>
using namespace std;
const int maxn=19999;
int n,m,s,t;
struct edge{
int nxt,to,w;
}d[maxn];//链式前向星
struct node{
int num,x;
bool operator <(const node &tmp)const{
return x>tmp.x;
} //为了优先队列
}temp;
int dis[maxn],head[maxn],cnt=1;
void add(int u,int v,int w){
d[cnt].to=v;
d[cnt].nxt=head[u];
d[cnt].w=w;
head[u]=cnt++;
}//加边
int vis[maxn];
void dij(int s)//迪杰特斯拉
{
priority_queue<node>q;
memset(dis,20,sizeof(dis));
dis[s]=0;
temp.num=s;temp.x=0;q.push(temp);
while(!q.empty()){
node ans=q.top();
q.pop();
if(dis[ans.num]!=ans.x) continue;
if(vis[ans.num]) continue;
vis[ans.num]=1;
for(int i=head[ans.num];i;i=d[i].nxt)
{
edge e=d[i];
if(dis[e.to]>dis[ans.num]+e.w){
dis[e.to]=dis[ans.num]+e.w;
if(vis[e.to]) continue;
temp.num=e.to,temp.x=dis[e.to];
q.push(temp);
}
}
}
return;
}
int main()
{
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++)
{
int l,r,t;
cin>>l>>r>>t;
add(l,r,t);
add(r,l,t);
}
dij(s);
cout<<dis[t];
}