c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 500005, M = 2000005; // M 开至无向边数的 2 倍以上
int n, m;
struct Edge {
int u, v, w;
} e[M];
int head[N], to[M], nxt[M], w[M], cnt = 2;
int dfn[N], low[N], tot;
int stk[N], top;
int bel[N], ebcc_cnt;
int dist[N],ecnt,diameter;
void add(int u, int v, int t = 0) { to[cnt] = v, nxt[cnt] = head[u], w[cnt] = t, head[u] = cnt++; }
void tarjan(int u, int in_edge) {
dfn[u] = low[u] = ++tot;
stk[++top] = u;
for (int i = head[u]; i; i = nxt[i]) {
if (i == (in_edge ^ 1)) continue;
int v = to[i];
if (!dfn[v]) {
tarjan(v, i);
low[u] = min(low[u], low[v]);
} else {
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u]) {
++ebcc_cnt;
do {
bel[stk[top]] = ebcc_cnt;
} while (stk[top--] != u);
}
}
void cand() {
cnt = 2;
for (int i = 1; i <= ebcc_cnt; i++) head[i] = 0;
for (int i = 0; i < m; i++) {
int u = bel[e[i].u], v = bel[e[i].v];
if (u == v) continue;
add(u, v, e[i].w), add(v, u, e[i].w);
}
}
void dfs(int u,int f,int limit){
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==f)continue;
dfs(v,u,limit);
int k=(w[i]<=limit?1:0);
ecnt+=k;
diameter=std::max(diameter,dist[u]+dist[v]+k);
dist[u]=std::max(dist[u],dist[v]+k);
}
}
bool check(int limit){
for(int i=1;i<=ebcc_cnt;i++)dist[i]=0;
ecnt=diameter=0;
dfs(1,0,limit);
return diameter<ecnt;
}
int com(){
int l=-1,r=100001;
while(l+1<r){
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid;
}
return r==100001?-1:r;
}
void fc() {
std::cin >> n >> m;
for (int i = 0; i < m; i++) {
std::cin >> e[i].u >> e[i].v >> e[i].w;
add(e[i].u, e[i].v,e[i].w);
add(e[i].v, e[i].u,e[i].w);
}
tarjan(1, 0);
cand();
std::cout<<com();
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// std::cin>>t;
while (t--) fc();
return 0;
}