#include<bits/stdc++.h>
using namespace std;

int l=INT_MAX,r=INT_MIN,n,m,s,t,ans;
//cost:记录拥挤度 
int f[20010],x[20010],y[20010],cost[20010];

//查找
int find(int x){
	return x == f[x]?x:f[x]=find(f[x]);
} 

//二分函数,看拥挤度在mid的情况下从s到t是否有通路
bool check(int mid){
	for(int i = 1;i <= n;i++) f[i] = i;//初始化
	//m条路 
	for(int i = 1;i <= m;i++){
		//代价大于mid的通路无效 
		if(cost[i] > mid) continue;
		int fx = find(x[i]),fy = find(y[i]);
		//将x[i]和y[i]合并到同一个集合 
		if(fx != fy){
			f[fx] = fy;	
		} 
	} 
	
	//如果s到t有通路
	if(find(s) == find(t)) return true;
	else return false;
} 

int main(){
	cin>>n>>m>>s>>t;
	//读入m条路的拥挤度
	for(int i = 1;i <= m;i++){
		cin>>x[i]>>y[i]>>cost[i];
		l = min(l,cost[i]);
		r = max(r,cost[i]);
	} 
	
	//二分拥挤度,找左边界 
	int mid; 
	while(l <= r){
		mid = (l + r) >> 1;
		//如果在拥挤度为mid的情况下有通路,尝试降低mid 
		if(check(mid)){
			r = mid - 1;
		}else{
			l = mid + 1;
		}
	} 
	
	//输出左边界 
	cout<<l;
	return 0;
} 

/**************************************************************
	Problem: 1923
	User: admin
	Language: C++
	Result: Accepted
	Time:33 ms
	Memory:2384 kb
****************************************************************/