#include<bits/stdc++.h>
using namespace std;
const int N = 2500+10, E = 6200*2;
typedef pair<int, int> PII;
int t, c, st, ed;
int h[N], e[E], ne[E], w[E], idx;
int dis[N];
bool vis[N];
void add(int a, int b, int c){
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void spfa(){
memset(dis, 0x3f, sizeof dis);
dis[st] = 0;
queue<int> q;
q.push(st);
vis[st] = true;
while(q.size()){
int t = q.front();
q.pop();
vis[t] = false;
for(int i=h[t]; ~i; i=ne[i]){
int j = e[i];
if(dis[j]>dis[t]+w[i]){
dis[j] = dis[t]+w[i];
if(!vis[j]){
q.push(j);
vis[j] = true;
//if(j==ed) return ; //可以提前退出
}
}
}
}
}
void dijkstra(){
memset(dis, 0x3f, sizeof dis);
memset(vis, false, sizeof vis);
dis[st] = 0;
for(int i=1; i<=t; i++){
int k = -1;
for(int j=0; j<=t; j++){
if(!vis[j] && (k==-1 || dis[k]>dis[j])){
k = j;
}
}
for(int i=h[k]; ~i; i=ne[i]){
int j = e[i];
dis[j] = min(dis[j], dis[k]+w[i]);
}
vis[k] = true;
}
}
void h_dijkstra(){
memset(dis, 0x3f, sizeof dis);
dis[st] = 0;
priority_queue<PII, vector<PII>, greater<PII>> q;
q.push({0, st});
while(q.size()){
PII tmp = q.top();
q.pop();
int v = tmp.second;
if(vis[v]) continue;
vis[v] = true;
//if(v==ed) return ; //可以提前退出
for(int i=h[v]; ~i; i=ne[i]){
int u = e[i];
if(dis[u]>dis[v]+w[i]){
dis[u] = dis[v]+w[i];
q.push({dis[u], u});
}
}
}
}
int main(){
scanf("%d%d%d%d", &t, &c, &st, &ed);
memset(h, -1, sizeof h);
int a, b, x;
for(int i=0; i<c; i++){
scanf("%d%d%d", &a, &b, &x);
add(a, b, x), add(b, a, x);
}
//spfa();
//dijkstra();
h_dijkstra();
cout<< dis[ed]<< endl;
return 0;
}