#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
****************************************************************/