#include<bits/stdc++.h>
using namespace std;
const int N = 20010,M = 100010;
struct edge{
int ed,next,len;
} b[M * 2];
int n,m,nbs[N],tot,maxx;
bool vis1[N],vis2[N];
queue<int> q;
void addedge(int u,int v,int l){
b[++tot].ed = v;b[tot].len = l;b[tot].next = nbs[u];nbs[u] = tot;
}
bool bfs(int x){
while(q.empty() == false){
q.pop();
}
q.push(1);
memset(vis1,false,sizeof(vis1));
vis1[1] = true;
memset(vis2,false,sizeof(vis2));
while(q.empty() == false){
int u = q.front();
for(int i = nbs[u];i;i = b[i].next){
if(b[i].len > x){
int v = b[i].ed;
if((vis1[u] == true and vis1[v] == true) or (vis2[u] == true and vis2[v] == true)){
return false;
}
if(vis1[v] == true or vis2[v] == true){
continue;
}
if(vis1[u] == true){
vis2[v] = true;
}else{
vis1[v] = true;
}
q.push(v);
}
}
q.pop();
}
return true;
}
int main(){
freopen("D:\\Download\\P1525_2.in","r",stdin);
cin >> n >> m;
for(int i = 1,u,v,l;i <= m;i ++){
cin >> u >> v >> l;
addedge(u,v,l);
addedge(v,u,l);
maxx = max(maxx,l);
}
int l = 0,r = maxx,ans;
while(l <= r){
int mid = (l + r) / 2;
if(bfs(mid) == true){
ans = mid;
r = ans - 1;
}else{
l = mid + 1;
}
}
cout << ans;
return 0;
}