#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
struct EDGE{
int v;
int w;
};
vector<EDGE>g[2600];
queue<int>q;
int s,t,n,m,dis[2600];
bool vis[2600];
int main(){
memset(dis,0x3f,sizeof(dis));
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
q.push(s);
dis[s]=0;
while (!q.empty()) {
int u = q.front();
q.pop(), vis[u] = 1;
for (auto p : g[u]) {
int v = p.v, w = p.w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if (!vis[v]) {
q.push(v); vis[v] = 1;
}
}
}
}
cout<<dis[t];
}