#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define INF 0xfffffff
using namespace std;
int n,m;
struct node{
int x,l;
};
vector<node> edge[100005];
int vis[100005];
int dis[100005];
void SPFA(int st){
queue<int> q;
int i;
memset(vis,0,sizeof(vis));
for(i = 1; i <= n; i++)
dis[i] = INF;
dis[st] = 0;
q.push(st);
while(!q.empty()){
int cur = q.front();
q.pop();
vis[cur] = 1;
int l = edge[cur].size();
for(i = 0; i < l; i++){
int tmp = edge[cur][i].x;
if(dis[tmp] > dis[cur] + edge[cur][i].l){
dis[tmp] = dis[cur] + edge[cur][i].l;
if(!vis[tmp]){
q.push(tmp);
vis[tmp] = 1;
}
}
}
vis[cur] = 0;
}
}
int main(){
int st,en;
while(~scanf("%d%d%d%d",&n,&m,&st,&en)){
int a,b,c;
node tmp;
for(int i = 0; i < m; i++){
scanf("%d%d%d",&a,&b,&c);
tmp.x = b,tmp.l = c;
edge[a].push_back(tmp);
tmp.x = a;
edge[b].push_back(tmp);
}
SPFA(st);
printf("%d\n",dis[en]);
}
return 0;
}