#include <iostream>
#include <cstdio>
#include <string.h>
#include <set>
#include <algorithm>
#include <math.h>
using namespace std;
int n,m,p[5005];
struct node{
int x,y,w;
}a[5005];
int fi(int x){
if(p[x]==x)
return x;
return fi(p[x]);
}
int cmb(node a,node b){
if(a.w<b.w)
return 1;
return 0;
}
int kruskal(int z){
set<int> t1;//可是不用set的只用flag就行了树的边为n-1
for(int i=0;i<=n;i++)
p[i]=i;
int sum=0,s1=0,s2=a[m-1].w,flag=0;
for(int i=z;i<m;i++){
int x=fi(a[i].x),y=fi(a[i].y);
if(x!=y){
flag++;
if(!t1.count(a[i].x)){
t1.insert(a[i].x);
sum++;
}
if(!t1.count(a[i].y)){
t1.insert(a[i].y);
sum++;
}
p[x]=y;
s1=max(s1,a[i].w);
s2=min(s2,a[i].w);
if(sum==n&&flag==n-1){
return s1-s2;
}
}
}
return a[m-1].w;
}
int main(){
freopen ("in.txt","r",stdin);
//freopen ("out.txt","r",stdout);
while(scanf("%d%d",&n,&m)){
if(n==0&&m==0)
break;
for(int i=0;i<m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
sort(a,a+m,cmb);
int ans=a[m-1].w;
for(int i=0;i<m;i++){
ans=min(ans,kruskal(i));
}
if(ans==a[m-1].w)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}