#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 20001
#define maxm 100001
using namespace std;
struct edge{
int u,v,w;
edge(){}
edge(const int &_u,const int &_v,const int &_w){
u=_u,v=_v,w=_w;
}
bool operator<(const edge &e)const{ return w>e.w; }
}e[maxm];
int fa[maxn<<1];
int n,m;
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int get(int x){
if(fa[x]==x) return x;
return fa[x]=get(fa[x]);
}
int main(){
n=read(),m=read();
for(register int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
e[i]=edge(u,v,w);
}
sort(e+1,e+1+m);
int ans=0;
for(register int i=1;i<=n<<1;i++) fa[i]=i;
for(register int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v;
if(get(u)==get(v)){ ans=e[i].w; break; }
fa[get(u)]=get(v+n),fa[get(u+n)]=get(v);
}
printf("%d\n",ans);
return 0;