/*
分析:
最小生成树,求最大边。
2012-07-30 11:24
*/
分析:
最小生成树,求最大边。
2012-07-30 11:24
*/
#include"stdio.h"
#include"stdlib.h"
int n;
struct A
{
int a,b;
int len;
int flag;
}E[2500000];
int K;
int set[2011];
int cmp(const void *a,const void *b)
{
struct A *c,*d;
c=(struct A *)a;
d=(struct A *)b;
return c->len-d->len;
}
void build(int num)
{
int i;
for(i=1;i<=num;i++) set[i]=i;
}
int find(int k)
{
if(set[k]==k) return k;
set[k]=find(set[k]);
return set[k];
}
void Union(int f1,int f2)
{
set[f1]=f2;
}
int MAX(int a,int b)
{
return a>b?a:b;
}
int Krustal()
{
int i;
int ans;
int f1,f2;
for(i=0;i<K;i++) E[i].flag=0;
for(i=0;i<K;i++)
{
f1=find(E[i].a);
f2=find(E[i].b);
if(f1==f2) continue;
Union(f1,f2);
E[i].flag=1;
}
ans=0;
for(i=0;i<K;i++) if(E[i].flag) ans=MAX(ans,E[i].len);
return ans;
}
int main()
{
int m;
int a,b,c;
while(scanf("%d%d",&n,&m)!=-1)
{
build(n);
for(K=0;K<m;K++)
{
scanf("%d%d%d",&a,&b,&c);
E[K].a=a;
E[K].b=b;
E[K].len=c;
}
qsort(E,K,sizeof(E[0]),cmp);
printf("%d\n",Krustal());
}
return 0;
}