并查集
#include <cstdio>
#include <algorithm>
using namespace std;
struct z{int x,y,k;}a[10001];
int n,m,f[101],total,ans,t,s;
int getf(int u){return (f[u]==u)?u:f[u]=getf(f[u]);}
bool cmp(z p,z q){return p.k<q.k;}
int main(){
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].k);
stable_sort(a+1,a+1+m,cmp); ans=10001;
for (int i=m-n+2;i>0;i--){ total=0;//用最小值枚举
for (int j=1;j<=n;j++) f[j]=j;
for (int j=i;j<=m;j++){//kruskal(从i开始)
int u=getf(a[j].x),v=getf(a[j].y);
if (u!=v){
total++;
if (total==n-1){
ans=min(ans,a[j].k-a[i].k);//记录最小差值
break;
}
f[u]=v;//并查集
}
}
}
if (ans==10001) puts("-1"); else printf("%d\n",ans);
}
return 0;
}