#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int N=2e4+10,M=1e5+10,MAX=1e9+1;
int n,m,ans,col[N],head[N],minn=MAX,maxn=0,cnt,a,b,c;
struct node{
int a,b,c,nxt;
}edge[M];
inline int read()
{
int p=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return f*p;}
bool cmp(node o,node q){
return o.c<q.c;
}
void add(int x,int y,int z){
cnt++;
edge[cnt].a=x;
edge[cnt].b=y;
edge[cnt].c=z;
edge[cnt].nxt=head[x];
head[x]=cnt;
}
//void dfs(int x){
//
//}
bool judge(int mid){
// int iop=upper_bound(edge+1,edge+m+1)-edge;
// for(int i=1;i<=n;i++) col[i]=0;
// for(int i=iop;i<=m;i++){
// if(col[edge[i].u]==0&&col[edge[i].v]==0){
// col[edge[i].u]=1,col[edge[i].v]=2;
// }
// else if(col[edge[i].u]==0||col[edge[i].v]==0){
// if(col[edge[i].u]==0){
//
// }
// }
// }
for(int i=1;i<=n;i++) col[i]=0;
queue<int> q;
for(int i=1;i<=n;i++){
if(col[i]) continue;
q.push(i);
col[i]=1;
while(!q.empty()){
int k=q.front();
q.pop();
for(int i=head[k];i;i=edge[i].nxt){
if(edge[i].c>mid){
if(col[edge[i].b]==0){
col[edge[i].b]=(col[k]==1?2:1);
q.push(edge[i].b);
}
else if(col[edge[i].b]==col[k]) return false;
}
}
}
}
return true;
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++){
a=read(),b=read(),c=read();
maxn=max(maxn,c),minn=min(minn,c);
add(a,b,c);
add(b,a,c);
}
int l=0,r=maxn;
// cout<<minn<<" "<<maxn<<endl;
while(l<=r){
int mid=(l+r)/2;
if(judge(mid)){
r=mid-1;
ans=mid;
}
else l=mid+1;
}
printf("%d",ans);
}