#include<iostream>
#include<cstdio>
using namespace std;
void read(int &x){
char v=getchar();x=0;
while(v<'0'||v>'9')v=getchar();
while(v>='0'&&v<='9')x=(x<<3)+(x<<1)+(v&15),v=getchar();
}
void write(int x){
if(x<10)putchar(x|48);
else write(x/10),putchar((x%10)|48);
}
int n,m;
int s[100005];
bool u[100005];
int d[100005];
struct hope{
int i,v;
hope *next=NULL;
}*head[100005];
int g[100005];
int _topg;
void add(int x){
g[++_topg]=x;
int i=_topg;
while(i>1&&d[g[i]]<d[g[i>>1]])
swap(g[i],g[i>>1]),i>>=1;
}
int pop(){
if(_topg<=0)return -1;
int vvv=g[1];
g[1]=g[_topg--];
int i=1;
while(i<<1<=n){
int son=i<<1;
if(son+1<=_topg&&d[g[son+1]]<d[g[son]])++son;
if(d[g[i]]<=d[g[son]])break;
swap(g[i],g[son]);
i=son;
}
return vvv;
}
void dijkstra(int st){
for(int i=1;i<=n;++i)d[i]=0x3fffffff;
for(int i=1;i<=n;++i)u[i]=0;
d[st]=0,u[st]=1;
add(st);
int x;
while((x=pop())!=-1){
for(hope *p=head[x];p!=NULL;p=p->next){
int y=p->i;
if(d[y]>max(d[x],p->v)){
d[y]=max(d[x],p->v);
if(!u[y])add(y),u[y]=1;
}
}
}
}
int main(){
int s,t;
cin>>n>>m>>s>>t;
for(int i=1;i<=m;++i){
int x,y,z;
read(x),read(y),read(z);
hope *p;
p=new hope();
p->i=y,p->v=z;
p->next=head[x];
head[x]=p;
p=new hope();
p->i=x,p->v=z;
p->next=head[y];
head[y]=p;
}
dijkstra(s);
cout<<d[t];
}```