/*
扩展域并查集
编号i表示与i同一间监狱,i+n表示与i不同监狱。
先按c从大到小排序,如果到了某次,当前两个人不得不在同一监狱,则输出。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int fa[N];
struct edge{
int a,b,c;
bool operator < (const edge&T)const{
return c > T.c;
}
}edge[N];
int find(int x){
if(x != fa[x]) fa[x] = find(fa[x]);
return fa[x];
}
int main(){
int n,m; cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b,c; cin>>a>>b>>c;
edge[i] = {a,b,c};
}
sort(edge+1,edge+m+1);
for(int i=1;i<=n+n;i++) fa[i] = i;
int res = 0;
for(int i=1;i<=m;i++){
int a = edge[i].a,b = edge[i].b,c = edge[i].c;
int x = find(a),y = find(b);
if(x == y){
res = c;
break;
}else{
fa[x] = find(b + n);
fa[y] = find(a + n);
}
}
cout<<res<<endl;
return 0;
}
*/
/*
二分图判断,将罪犯分成两组,
设置一个限制,将大于这个限制的边放到组间,小于等于放到组内。
然后用染色法判断是否为二分图。
限制用二分答案计算。
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int e[N],ne[N],h[N],w[N],idx=1;
int color[N];
int n,m;
void add(int a,int b,int c){
w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u,int c,int mid){
color[u] = c;
for(int i=h[u];i;i=ne[i]){
if(w[i] <= mid) continue;
int j = e[i];
if(color[j]){
if(color[j] == color[u]) return false;
}else if(!dfs(j,3-c,mid)) return false;
}
return true;
}
bool check(int mid){
memset(color,0,sizeof(color));
for(int i=1;i<=n;i++)
if(!color[i])
if(!dfs(i,1,mid)) return false;
return true;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b,c; cin>>a>>b>>c;
add(a,b,c);add(b,a,c);
}
int l = 0,r = 1e9;
while(l < r){
int mid = (l + r) >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout<<r<<endl;
return 0;
}