#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=2e4+10,M=2e5+10;
int n,m;
int h[N],e[M],ne[M],w[M],idx;
int color[N];
//Y总太牛了,利用二分,确定一个limit,就可以整块使用二分染色了
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
bool bfs(int u,int c,int limit){
color[u]=c;
//列举u的所有邻边
for(int i=h[u];i!=-1;i=ne[i])
{
if(w[i]<=limit) continue;
int j=e[i];
if(!color[j]){
if(!bfs(j,3-c,limit)) return false;
}else if(c==color[j]) return false;
}
return true;
}
bool check(int limit){
for(int i=1;i<=n;i++){
if(!color[i]){
if(!bfs(i,1,limit)){
return false;
}
}
}
return true;
}
int main(){
scanf("%d%d",&n,&m);
memset(h,-1,sizeof h);
while(m--){
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
add(a,b,w),add(b,a,w);
}
//根据题目中c的取值范围
int l=0,r=1e9,mid=0;
while(l<r){
memset(color,0,sizeof color);
mid=l+r>>1;//相当于除2,在右侧界
if(check(mid)) r=mid;
else l=mid+1;
}
//这里好神奇啊,我用mid输出就不行,用l或r输出就行
//二分的结果如果不是某条边的权值,那就必然不是最小值,因为可以将这个结果减小到某条边的权值。
cout<<r<<endl;
return 0;
}