#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=3000,M=7000;
int n,m,s,t,tot,d[N];
queue<int> q;
bool vis[N];
struct node{
int ver,edge,next,head;
}f[N*4];
void add(int x,int y,int z){
f[++tot].ver=y;
f[tot].edge=z;
f[tot].next=f[x].head;
f[x].head=tot;
}
void spfa(){
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
d[1]=0;
vis[1]=1;
q.push(1);
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=f[x].head;i;i=f[i].next){
int y=f[i].ver,z=f[i].edge;
if(d[y] > d[x]+z){
d[y]=d[x]+z;
if(!vis[y]) q.push(y),vis[y]=1;
}
}
}
}
int main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
spfa();
cout<<d[t];
return 0;
}