#include <iostream>
#include <algorithm>
using namespace std;
//挑战程序设计竞赛例题
//谢谢博友文章
const int INF=1000000001;
int cost[2001][2001];//cost[u][v]表示边e=(u,v)的权值(不存在的情况下设为INF)
int mincost[2001];//从集合X出发的边到每个顶点的最小权值
bool used[2001];//顶点i是否包含在集合X中
int V;//顶点数
int main()
{
cin>>V;
for(int i=0;i<V;i++)
{
for(int j=0;j<V;j++)
{
cost[i][j]=INF;
}
}
int NUM;
cin>>NUM;
for(int i=0;i<NUM;i++)
{
int x,y,zhi;
cin>>x>>y>>zhi;
if(cost[x-1][y-1]>zhi)//抄博友 两个农场之间有多条道路
{
cost[x-1][y-1]=zhi;
cost[y-1][x-1]=zhi;
}
}
/*
for(int i=0;i<V;i++)
{
for(int j=0;j<V;j++)
{
cout<<cost[i][j]<<" ";
}
cout<<endl;
}*/
for(int i=0;i<V;i++)
{
mincost[i]=INF;
used[i]=false;
}
mincost[0]=0;
int jg=0;
while(true)
{
int v=-1;
//从不属于X的顶点中选取从X到其权值最小的顶点
for(int u=0;u<V;u++)
{
if(!used[u]&&(v==-1||mincost[u]<mincost[v]))
{
v=u;
}
}
if(v==-1)
{
break;
}
used[v]=true;//把顶点v加人X
if(jg<mincost[v])
{
jg=mincost[v];//把边的长度加到结果里
//cout<<mincost[v]<<endl;
}
for(int u=0;u<V;u++)
{
mincost[u]=min(mincost[u],cost[v][u]);
}
}
cout<<jg<<endl;
return 0;
}
求最小生成树中的最长边