#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pb push_back
#define pii pair<int, int>
#define il inline
#define fastio ios::sync_with_stdio(false), cin.tie(0)
const int N=1e5+5;
int n,m;
struct Edge{
int u, v, w;
bool operator < (const Edge & ano){
return w < ano.w;
}
} E[N];
int B[N];
int MX1[N];
int MX2[N];
vector<pii> G[20005];
int Not(int x){
if(x == 1) return 2;
if(x == 2) return 1;
return -1;
}
int main(){
fastio;
cin >> n >> m;
for(int i=1; i<=m; i++){
int ai, bi, ci;
cin >> ai >> bi >> ci;
E[i] = {ai, bi, ci};
G[ai].pb({bi, ci}), G[bi].pb({ai, ci});
}
sort(E+1, E+m+1);
for(int k=m; k>=1; k--){
Edge & ed = E[k];
if(!B[ed.u] && !B[ed.v]){
int mx1=0, mx2=0;
for(pii e : G[ed.u]){
if(B[e.first] == 1) mx1 = max(mx1, e.second);
if(B[e.first] == 2) mx2 = max(mx2, e.second);
}
for(pii e : G[ed.v]){
if(B[e.first] == 2) mx1 = max(mx1, e.second);
if(B[e.first] == 1) mx2 = max(mx2, e.second);
}
if(mx1 < mx2){
B[ed.u] = 1;
B[ed.v] = 2;
}
else B[ed.u] = 2, B[ed.v] = 1;
}
else if(!B[ed.u]){
if(B[ed.v] == 1)
B[ed.u] = 2;
else if(B[ed.v] == 2)
B[ed.u] = 1;
}
else if(!B[ed.v]){
if(B[ed.u] == 1)
B[ed.v] = 2;
else if(B[ed.u] == 2)
B[ed.v] = 1;
}
else{
if(B[ed.u] == B[ed.v]){
printf("%d\n", ed.w);
return 0;
}
}
}
printf("0\n");
return 0;
}