#include <cstdio>
#include <cstring>
#include <queue>
#include <utility>
#define inf (6200000)
using namespace std;
struct Edge{
int v, w;
int next;
} edge[6201];
int head[2501], cnt = 1;
void addedge(int u, int v, int w){
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int Dijkstra(int s,int t){
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
int dis[2501];
bool vis[2501];
memset(dis, inf, sizeof(dis));
memset(vis, false, sizeof(vis));
q.push(make_pair(0, s));
while(!q.empty()){
pair<int, int> top = q.top();
q.pop();
int u = top.second,w = top.first;
if(vis[u]) continue;
vis[u] = true;
dis[u] = w;
for(int i = head[u];i != 0;i = edge[i].next){
int v = edge[i].v;
if(dis[v] > dis[u] + edge[i].w) q.push(make_pair(dis[u] + edge[i].w, v));
}
}
return dis[t];
}
int n, m, s, t;
int main(){
scanf("%d%d%d%d", &n, &m, &s, &t);
while(--m){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
}
printf("%d", Dijkstra(s, t));
return 0;
}
大 红 大 紫