#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20010, M = 200010;
int n, m;
int head[N], e[M], w[M], ne[M], idx;
int color[N];
void add(int a, int b, int c) {
e[idx] = b;
w[idx] = c;
ne[idx] = head[a];
head[a] = idx ++;
}
// u 待染色的点
// c 将其染成c色
// mid冲突事件的影响力
bool dfs(int u, int c, int mid) {
color[u] = c;
for (int i = head[u]; i != -1; i = ne[i]) {
int j = e[i];
if (w[i] <= mid) continue; // 可以容忍这样的冲突,放哪都莫得关系
if (color[j]) { // 如果w[i] > mid,辣就8能容忍这样的冲突, 得放到别的监狱
if (color[j] == c) return false; // 如果这哥们j已经在u所在的监狱,那GG
} else if (!dfs(j, 3 - c, mid)) return false;
// 如果这哥们不能放到另外一所监狱, 那也GG
}
return true;
}
bool check(int mid) {
memset(color, 0, sizeof color);
for (int i = 1; i <= n; i ++) {
if (!color[i]) // 如果i没染上色,那就染一下(染成1)
if (!dfs(i, 1, mid)) // 如果染不上, 那就GG, 这个冲突事件的影响力是无法达到的
return false;
}
return true;
}
// 二分图的三个结论
// 一个图是二分图 等价于 不含奇数环 等价于 染色法不存在矛盾
int main() {
scanf("%d%d", &n, &m);
memset(head, -1, sizeof head);
while (m --) {
int a, b, c;
scanf("%d%d%d", &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;
}
printf("%d\n", r);
return 0;
}