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

struct node{
	int x,y,z;//x和y的怨气值为z 
}a[200000]; 

int n,m,f[20100];//f:存储关系 
int t[20100];//标记每个人的敌人 

//查:查询元素的根 
int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
} 

//并:合并元素xy
void merge(int x,int y){
	int fx = find(x);
	int fy = find(y);
	if(fx != fy){
		f[fx] = fy;
	}
} 

//重写cmp:按照怨气值降序排序 
bool cmp(node n1,node n2){
	return n1.z > n2.z;
} 

int main() {
	cin>>n>>m;
	int i;
	for(i = 1;i <= n;i++) f[i] = i;//并查集初始化
	//读入m个关系
	for(i = 1;i <= m;i++){
		cin>>a[i].x>>a[i].y>>a[i].z; 
	} 
	
	//按怨气值降序 
	sort(a+1,a+1+m,cmp);
	
	//判断m个关系	
	for(i = 1;i <= m;i++){
		//如果两个罪犯在一个集合中,说明这就是最大的怨气值 
		if(find(a[i].x) == find(a[i].y)){
			cout<<a[i].z;
			return 0;
		}else{
			//t数组标记每个人的敌人
			//如果这个人还没有敌人,则标记出这个人的敌人 
			//有敌人,则合并 
			if(t[a[i].x]==0) t[a[i].x] = a[i].y;
			else merge(t[a[i].x],a[i].y);
			
			if(t[a[i].y]==0) t[a[i].y] = a[i].x;
			else merge(t[a[i].y],a[i].x); 
		}
	} 
	
	cout<<0;
	return 0;
}
/**************************************************************
	Problem: 1930
	User: admin
	Language: C++
	Result: Accepted
	Time:290 ms
	Memory:4576 kb
****************************************************************/