/*
二分图染色版本
两个监狱对应二部图的两部分
在给定的怨气值里二分
对于每一个Ci 进行染色判断是否合法
染色的时候 如果这条边的ci > Ci 这两个人就带分开 即染成不同的颜色
如果染色到某两个点颜色相同且怨气值>Ci 这个Ci就不合法
二分直到最后答案
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,m,num,head[maxn],Ci,ans,color[maxn];
struct node
{
int v,t,pre;
}e[maxn*2];
struct nope
{
int x,y,z;
}p[maxn];
int cmp(const nope &a,const nope &b)
{
return a.z<b.z;
}
void Add(int from,int to,int dis)
{
num++;
e[num].t=dis;
e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
bool Color(int s)
{
for(int i=head[s];i;i=e[i].pre)
if(e[i].t>Ci)
{
if(color[s]==color[e[i].v])return 0;
if(color[e[i].v]==0)
{
color[e[i].v]=3-color[s];
if(!Color(e[i].v))return 0;
}
}
return 1;
}
bool pd()
{
for(int i=1;i<=n;i++)
if(color[i]==0)
{
color[i]=1;
if(!Color(i))return 0;
}
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
int u,v,t;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&t);
p[i].x=u;p[i].y=v;p[i].z=t;
Add(u,v,t);Add(v,u,t);
}
sort(p+1,p+1+m,cmp);
int l=0,r=m;
while(l<=r)
{
memset(color,0,sizeof(color));
int mid=(l+r)/2;
Ci=p[mid].z;
if(pd())
{
r=mid-1;
ans=Ci;
}
else l=mid+1;
}
printf("%d
",ans);
return 0;
}