#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 10005;
int f[MAXN];
struct node {
int x, y, t;
};
bool cmp(node a, node b) {
return a.t < b.t;
}
int find(int i) {
if (f[i] != i) {
f[i] = find(f[i]);
}
return f[i];
}
int main() {
int n, m;
cin >> n >> m;
// 初始化并查集
for (int i = 1; i <= n; i++) {
f[i] = i;
}
// 读取边的信息
node b[MAXN];
for (int i = 1; i <= m; i++) {
cin >> b[i].x >> b[i].y >> b[i].t;
}
// 按边的权重排序
sort(b + 1, b + 1 + m, cmp);
int num = 0, ans = 0;
// Kruskal算法核心部分
for (int i = 1; i <= m; i++) {
int r1 = find(b[i].x);
int r2 = find(b[i].y);
if (r1 != r2) {
f[r1] = r2; // 合并两个集合
num++;
ans = max(ans, b[i].t);
if (num == n - 1) break; // 提前结束循环
}
}
// 检查是否形成了最小生成树
if (num != n - 1) {
cout << -1;
} else {
cout << ans;
}
return 0;
}