#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;++i)
#define fq(i,a,b) for(re int i=a;i>=b;--i)
using namespace std;
const int N=1e5+100;
int n,m,f[N];
il int find(re int x){return x==f[x]?x:f[x]=find(f[x]);}
struct dat{int u,v,w;il bool operator < (const dat &o) const {return w>o.w;}}a[N];
il ll gi()
{re ll x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;
}
il void cmax(re int &x,re int y){x=(x>y?x:y);}
int main()
{n=gi();m=gi();fp(i,1,n*2) f[i]=i;fp(i,1,m){re int u=gi(),v=gi(),w=gi();a[i]=(dat){u,v,w};}sort(a+1,a+1+m);fp(i,1,m){re int u=a[i].u,v=a[i].v,w=a[i].w,fu=find(u),fv=find(v);if(fu==fv) return printf("%d\n",w),0;f[fu]=find(v+n);f[fv]=find(u+n);}puts("0");return 0;
}
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;++i)
#define fq(i,a,b) for(re int i=a;i>=b;--i)
using namespace std;
const int N=1e5+100;
int n,m,h[N],cnt,col[N],tag;
struct Edge{int to,nxt;}e[N<<1];
struct dat{int u,v,w;il bool operator < (const dat &o) const {return w>o.w;}}a[N];
il void add(re int u,re int v){e[++cnt]=(Edge){v,h[u]};h[u]=cnt;}
il ll gi()
{re ll x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;
}
il void dfs(re int u)
{if(!tag) return;for(re int i=h[u];i+1;i=e[i].nxt){re int v=e[i].to;if(col[v]==-1) col[v]=col[u]^1,dfs(v);else if(col[v]==col[u]) {tag=0;return;}}
}
il int check(re int x)
{memset(h,-1,sizeof(h));cnt=0;memset(col,-1,sizeof(col));fp(i,1,m)if(a[i].w>x) add(a[i].u,a[i].v),add(a[i].v,a[i].u);tag=1;fp(i,1,n) if(col[i]==-1) col[i]=0,dfs(i);return tag;
}
il void cmax(re int &x,re int y){x=(x>y?x:y);}
int main()
{n=gi();m=gi();fp(i,1,m){re int u=gi(),v=gi(),w=gi();a[i]=(dat){u,v,w};}sort(a+1,a+1+m);re int l=0,r=a[1].w,ans=0;while(l<=r){re int mid=l+r>>1;if(check(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);return 0;
}
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define pc(a) putchar(a)
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=2e5+100,inf=1e9+100;
int f[N],n,m,dp[N],h[N];
bool vis[N];
ll ans;
struct dat{int u,v,w;bool operator < (const dat &o) const {return w>o.w;}}a[N<<1];
il int find(re int x){while(f[x]^x) x=f[x];return x;}
il int Dis(re int x){re int res=0;while(f[x]^x) res^=dp[x],x=f[x];return res;}
il int gi()
{re int x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;
}
int main()
{n=gi();m=gi();fp(i,1,n) f[i]=i,h[i]=1;fp(i,1,m) a[i].u=gi(),a[i].v=gi(),a[i].w=gi();sort(a+1,a+1+m);fp(i,1,m){re int u=a[i].u,v=a[i].v,fu=find(u),fv=find(v),w=a[i].w;if(fu^fv) dp[fu]^=Dis(u)^Dis(v)^1,f[fu]=fv;else if(Dis(u)^Dis(v)==0) {printf("%d\n",w);return 0;}}puts("0");return 0;
}