/*
分析:
最小生成树,求最大边。
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; }