#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
const int N=2505,M=6205;
priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > >q;
int n,m,s,e,u,v,w,dis[N],vis[N];
int head[N],to[M],nxt[M],val[M],idx;
void add(int u,int v,int w){
to[idx]=v,val[idx]=w,nxt[idx]=head[u],head[u]=idx++;
}
void dijkstra(){
memset(dis,0x3f,sizeof dis);
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int j=head[x];~j;j=nxt[j]){
int y=to[j];
if(dis[y]>dis[x]+val[j]){
dis[y]=dis[x]+val[j];
q.push(make_pair(dis[y],y));
}
}
}
}
int main(){
memset(head,-1,sizeof head);
memset(vis,0,sizeof vis);
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=1;i<=m;++i){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dijkstra();
printf("%d\n",dis[e]);
return 0;
}