#include<algorithm>
using namespace std;
const int N = 20010;
const int M = 100010;
struct ct {
    int a;
    int b;
    int yq;
}cts[M];//记载冲突
int fa[N];//用于记录集合,同一并差集表示同一监狱
int ba[N];//记载威胁最大的敌人
bool cmp(ct a1, ct b1)
{
    return a1.yq > b1.yq;
}
int find(int a)
{
    if (a == fa[a]) return a;
    else return fa[a] = find(fa[a]);
}
void un(int a, int b)
{
    fa[find(a)] = find(b);
}
int n, m;
int main()
{
    cin >> n >> m;
    int cnt = 1;
    for (int i = 1; i <= n; i++)
    {
        fa[i] = i;
    }
    for (int i = 1; i <= m; i++)
    {
        int a = 0, b = 0;
        cin >> a >> b >> cts[cnt].yq;
        cts[cnt].a = a;
        cts[cnt].b = b;
        cnt++;
    }//离线操作
    sort(cts + 1, cts + m + 1,cmp);
    //贪心思想,优先满足火气大的罪犯
    for (int i = 1; i <= m; i++)
    {
        int cr1 = cts[i].a;
        int cr2 = cts[i].b;
        int gfa = find(cr1);
        int gfb = find(cr2);
        if(!ba[cts[i].b])
        ba[cts[i].b] = cts[i].a;
        if (!ba[cts[i].a])
        ba[cts[i].a] = cts[i].b;//ba如果没有指向,那么代表节点在此之前没有冲突,此时把b作为a的敌人并查集的索引
        if (gfa != gfb)//不是一个集合说明可以分开
        {
            un(cr1, ba[cr2]);
            un(cr2, ba[cr1]);
        }
        else//是一个集合说明有一个矛盾更大的共同敌人,已经无法满足需要
        {
            cout << cts[i].yq;
            return 0;
        }
    }
    cout << 0;
    return 0;
}