#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Edge{
    int u,v,w;
    bool operator<(const Edge& other)const{
        return w<other.w;
    }
};

vector<int> parent,rank_set;

int find(int x){
    if(parent[x]!=x)parent[x]=find(parent[x]);
    return parent[x];
}

void unite(int x,int y){
    int rootX=find(x);
    int rootY=find(y);
    if(rootX!=rootY){
        if(rank_set[rootX]>rank_set[rootY])
            parent[rootY]=rootX;
        else if(rank_set[rootX]<rank_set[rootY])
            parent[rootX]=rootY;
        else{
            parent[rootY]=rootX;
            rank_set[rootX]++;
        }
    }
}

int main() {
    int N,M;
    cin>>N>>M;
    vector<Edge> edges(M);
    for(int i=0;i<M;++i){
        int P,Q,K;
        cin>>P>>Q>>K;
        edges[i]={P,Q,K};
    }
    sort(edges.begin(),edges.end());
    parent.resize(N+1);
    rank_set.resize(N+1,0);
    for(int i=1;i<=N;++i)
        parent[i]=i;
    int max_edge_in_mst=0;
    int edges_used=0;
    for(const auto&edge:edges){
        if(find(edge.u)!=find(edge.v)){
            unite(edge.u,edge.v);
            max_edge_in_mst=edge.w;
            edges_used++;
            if(edges_used==N-1)
                break;
        }
    }
    cout<<max_edge_in_mst<<endl;
    return 0;
}
// 64 位输出请用 printf("%lld")