#include <bits/stdc++.h>
using namespace std;
const int MAX=1000000007;
struct edge{int u,v,cost;};
int p[10001];
int r[10001];

void init(int n) {
  for(int i=0; i<n; i++) {
    p[i]=i;
    r[i]=0;
  }
}
int find(int x) {
  if(p[x]==x) return x;
  else return p[x]=find(p[x]);
}
void unite(int x,int y) {
  x=find(x);
  y=find(y);
  if(x==y) return;

  if(r[x]<r[y]) p[x]=y;
  else {
    p[y]=x;
    if(r[x]==r[y]) r[x]++;
  }
}
bool same(int x, int y) {
  return find(x)==find(y);
}

bool comp(const edge &e1,const edge &e2){
  return e1.cost < e2.cost;
}
 
int V,E;
edge es[10001];
int k;
int kruskal(){
  init(V);
  set<int> s;
  int ma=0,mi=MAX,cnt=0;
  for(int i = k ; i < E ; i++){
    edge e = es[i];
    if(!same(e.u,e.v)){
      unite(e.u,e.v);
      ma = max(ma,e.cost);
      mi = min(mi,e.cost);
      s.insert(e.u);
      s.insert(e.v);
      cnt++;
    }
  }
  if(s.size()!=V || cnt!=V-1) return MAX;
  return ma-mi;
}

int main() {
  while(cin >> V >> E && V) {
    for(int i=0; i<E; i++) {
      int x,y,z;
      cin >> x >> y >> z;
      x--;y--;
      es[i]=(edge){x,y,z};
    }
    if(V>E+1 || E==0) {
      cout << -1 << endl;
      continue;
    }
    sort(es,es+E,comp);
    int ans=MAX;
    for(k=0; k<E; k++) {
      ans=min(ans,kruskal());
    }
    if(ans!=MAX) cout << ans << endl;
    else cout << -1 << endl;
  }
  return 0;
}
