#include<bits/stdc++.h>
#define int long long
#define inf 2500020
using namespace std;
int n,m,s,t;
int u,v,w;
int fir[6500],nex[6500];
int dis[3000];
bool vis[3000];
int cnt;
struct road{
int from,to,v;
}r[6500];
struct di{
int fro,v;
bool operator<(const di &x)const{return x.v<v;}
};
priority_queue<di>p;
void add(int a,int b,int c){
r[cnt].from=a;
r[cnt].to=b;
r[cnt].v=c;
nex[cnt]=fir[a];
fir[a]=cnt;
cnt++;
}
signed main(){
cin>>n>>m>>s>>t;
for(int i=0;i<=n+1;i++){
dis[i]=inf;
}
memset(fir,-1,sizeof(fir));
memset(nex,-1,sizeof(nex));
for(int i=0;i<m;i++){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dis[s]=0;
p.push(di{s,0});
while(!p.empty()){
di t=p.top();
p.pop();
if(vis[t.fro])continue;
vis[t.fro]=1;
int sta=t.fro;
for(int k=fir[sta];k!=-1;k=nex[k]){
int y=r[k].to;
if(dis[sta]+r[k].v<dis[y]){
dis[y]=dis[sta]+r[k].v;
if(vis[y]==0)p.push(di{y,dis[y]});
}
}
}
cout<<dis[t];
return 0;
}