/* 最大路与最小路的问题: 这道题看似简单,但是若不知道思路将无法写出。 思路:最小生成树很容易求出,但是最大值与最小值只差很难保证是最小的, 比如:1 5 5 6 100 101 很明显101 - 5 < 100 - 1 所以:只需要枚举到m条边的情况就行。 */ #include<iostream> #include<algorithm> #include<cstdio> using namespace std; class kruskal { public: int a,b,value; }edge[15005]; int n,m; int f[10000];//并查集 int s[10000];//根的数目 int ans; bool cmp(kruskal a,kruskal b) { return a.value < b.value; } int Find(int x) { if(f[x] == x) return x; else f[x] = Find(f[x]); return f[x]; } int Union(int x,int y) { int a = Find(x); int b = Find(y); if(a == b) return 0; else if(s[a] <= s[b]){ //使用了优化并查集 f[a] = b; s[b] += s[a]; } else { f[b] = a; s[a] += s[b]; } return 1; } int kruskal(int i) { int pos = 0; int r; for( ;i <= m; i++){ if(Union(edge[i].a,edge[i].b)){ pos++; if(pos == 1) r = edge[i].value; if(pos == n - 1){ ans =min(ans,edge[i].value - r); } } } return ans; } int main() { //freopen("in.txt","r",stdin); while(cin>>n>>m){ if(n == 0 && m == 0) break; for(int i = 1;i <= m; i++) cin>>edge[i].a>>edge[i].b>>edge[i].value; ans = 99999999; sort(edge+1,edge+m+1,cmp); for(int i = 1;i <= m - n + 2; i++){ for(int j = 1;j <= n; j++) { f[j] = j; s[j] = 1; } ans = kruskal(i); } if(ans == 99999999){ printf("-1\n"); } else printf("%d\n",ans); } return 0; }