#include<bits/stdc++.h>
typedef long long ll;
const ll MAXN=15e5;
using namespace std;
struct edge{
ll to,val;
};
bool operator<(const edge&a,const edge&b){return a.val>b.val;}
vector<edge>G[MAXN];
ll n,m,s,t,x,y,w,dis[MAXN];
bool vis[MAXN];
void Dijkstra(ll s){
memset(dis,0x3f3f3f3f3f3f3f3f3f3f,sizeof(dis)),dis[s]=0;
priority_queue<edge>q;
q.push(edge{s,0});
while(!q.empty()){
ll u=q.top().to;
q.pop();
if(vis[u])continue;
vis[u]=true;
for(int i=0;i<G[u].size();i++){
ll v=G[u][i].to;
if(dis[v]>dis[u]+G[u][i].val){
dis[v]=dis[u]+G[u][i].val;
q.push(edge{v,dis[v]});
}
}
}
}
signed main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
cin>>x>>y>>w;
G[x].push_back(edge{y,w}),G[y].push_back(edge{x,w});
}
Dijkstra(s);
cout<<dis[t];
return 0;
}