#include <bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1,ch=getchar();
for(;!isdigit(ch);ch=getchar()) f=(ch=='-')?-1:1;
for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
int head[100001],cnt;
struct node{
int to,nxt;
}e[100010];
bool f[100010];
void add(int x,int y){
cnt++;
e[cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
}
int n,m;
queue <int> q;
int a[100010];
int bfs(){
for(int i=1;i<=n;i++){
if(f[i]==false){
q.push(i);
f[i]=true;
a[i]=1;
while(!q.empty()){
int o=q.front();
f[o]=true;
q.pop();
for(int j=head[o];j!=0;j=e[j].nxt){
if(a[e[j].to]!=0){
if(a[e[j].to]==a[o]){
return 0;
}
}else{
if(a[o]==1){
a[e[j].to]=2;
q.push(e[j].to);
}else{
a[e[j].to]=1;
q.push(e[j].to);
}
}
}
}
}
}
return 1;
}
struct edge{
int x,y,z;
}b[1000001];
int cmp(edge g,edge r){
return g.z>r.z;
}
int main(){
n=read();
m=read();
for(int i=1;i<=m;i++){
b[i].x=read();
b[i].y=read();
b[i].z=read();
}
sort(b+1,b+m+1,cmp);
int l=1,r=m,mid=0,ans=-1;
while(l<=r){
mid=(l+r)/2;
memset(a,0,sizeof(a));
memset(f,false,sizeof(f));
memset(head,0,sizeof(head));
for(int i=1;i<=cnt;i++){
e[i].to=0;
e[i].nxt=0;
}
cnt=0;
for(int i=1;i<=mid;i++){
add(b[i].x,b[i].y);
add(b[i].y,b[i].x);
}
if(bfs()==1){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
if(ans==m){
cout<<0;
}else{
cout<<b[ans+1].z;
}
return 0;
}