#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
int n,m;
int fa[maxn],id[maxn],w[maxn],u[maxn],v[maxn];
int cmp(const int a,const int b)//间接排序,按照权值大小排序边的标号
{
return w[a]<w[b];
}
int Find(int x)
{
if(fa[x]==x) return x;
else return fa[x]=Find(fa[x]);
}
int main()
{
while(scanf("%d%d",&n,&m) && (n || m))
{
memset(w,0,sizeof(w));
memset(u,0,sizeof(u));
memset(v,0,sizeof(v));
for(int i=0; i<m+1; i++) id[i]=i;//注意这个地方是m别和父亲的初始化一样写成了n
for(int i=0; i<m; i++)
scanf("%d%d%d",&u[i],&v[i],&w[i]);
sort(id,id+m,cmp);
sort(w,w+m);
int ans=1e8;
for(int l=0; l<m; l++)//循环l-r条边
{
for(int i=0; i<n+1; i++) fa[i]=i;
int cnt=n;
for(int r=l; r<m; r++)
{
int e=id[r];
int x=Find(u[e]);
int y=Find(v[e]);
if(x!=y)
{
fa[x]=y;
if(--cnt==1)//如果l-r条边能生成树,则求其苗条度
{
ans=min(ans,w[r]-w[l]);
break;
}
}
}
}
if(ans==1e8) ans=-1;
printf("%d\n",ans);
}
return 0;
}
题意就是找苗条度最小的生成树,所以枚举下能生成的生成树,求每次的苗条度即可。