#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#define MAXN 10005
#define MAXM 20005
#define INF 0x3f3f3f
using namespace std;
struct edge
{
int v,w;
edge(int v=0,int w=0)
{
this->v=v;
this->w=w;
}
friend bool operator <(edge a,edge b)
{
return a.w<b.w;
}
};
struct node
{
int id,d;
node(int id=0,int d=0)
{
this->id=id;
this->d=d;
}
friend bool operator <(node a,node b)
{
return a.d<b.d;
}
};
vector <edge> adj[MAXM];
int d[MAXN];
bool vis[MAXN];
int n,m,s,t;
void dikjstra(int s)
{
for(int i=1;i<=n;i++)
{
d[i]=INF;
}
priority_queue<node> q;
q.push(node(s,0));
d[s]=0;
int u,v,w;
while(!q.empty())
{
u=q.top().id;
q.pop();
if(vis[u]==1)
continue;
vis[u]=1;
for(int k=0;k<adj[u].size();k++)
{
v=adj[u][k].v;
w=adj[u][k].w;
if(d[v]>max(d[u],w))
{
d[v]=max(d[u],w);
//cout<<u<<"->"<<v<<endl;
q.push(node(v,d[v]));
}
}
}
}
int main()
{
int u,v,w;
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
adj[u].push_back(edge(v,w));
adj[v].push_back(edge(u,w));
}
for(int i=1;i<=n;i++)
{
sort(adj[i].begin(),adj[i].end());
}
dikjstra(s);
cout<<d[t];
return 0;
}