#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m;
bool vis[2503];
int d[2503];
struct node{
int v,w;
};
vector<node> G[2503];
void dijkstra(){
d[1]=0;
while(1){
int x=0;
int minn=INF;
for(int i=1;i<=n;i++){
if(!vis[i]&&d[i]<minn){
x=i;
minn=d[i];
}
}
if(x==0)break;
vis[x]=true;
for(int i=0;i<G[x].size();i++){
int y=G[x][i].v;int z=G[x][i].w;
if(!vis[y]&&d[y]>d[x]+z)d[y]=d[x]+z;
}
}
}
int main()
{
memset(vis,false,sizeof(vis));
memset(d,INF,sizeof(d));
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
G[a].push_back({b,c});
G[b].push_back({a,c});
}
dijkstra();
int ans=0;
for(int i=2;i<=n;i++){
ans=max(ans,d[i]);
}
cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,S,T;
bool vis[2503];
int d[2503];
struct node{
int v,w;
};
vector<node> G[2503];
void dijkstra(){
d[S]=0;
while(1){
int x=0;
int minn=INF;
for(int i=1;i<=n;i++){
if(!vis[i]&&d[i]<minn){
x=i;
minn=d[i];
}
}
if(x==0)break;
vis[x]=true;
for(int i=0;i<G[x].size();i++){
int y=G[x][i].v;int z=G[x][i].w;
if(!vis[y]&&d[y]>d[x]+z)d[y]=d[x]+z;
}
}
}
int main()
{
memset(vis,false,sizeof(vis));
memset(d,INF,sizeof(d));
cin>>n>>m>>S>>T;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
G[a].push_back({b,c});
G[b].push_back({a,c});
}
dijkstra();
cout<<d[T];
return 0;
}