#include <bits/stdc++.h>

using namespace std;

#define LOG(...) fprintf(stderr,__VA_ARGS__)
//#define LOG(...)
#define FOR(i,a,b) for(int i=(int)(a);i<(int)(b);++i)
#define RFOR(i,a,b) for(int i=(int)(b-1);i>=(int)(a);--i)
#define REP(i,n) for(int i=0;i<(int)(n);++i)
#define RREP(i,n) for(int i=(int)(n-1);i>=0;--i)
#define ALL(a) (a).begin(),(a).end()
#define RALL(a) (a).rbegin(),(a).rend()
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort(ALL(c))
#define RSORT(c) sort(RALL(c))
#define SZ(a) ((int)(a).size())
#define BIT(x, i) (((x) >> (i)) & 1)
#define SQ(x) ((x)*(x))

typedef long long ll;
typedef unsigned long long ull;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vb> vvb;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<string> vs;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

#define INF 1e8

int N, M;

// ?´?????????????????§????
struct UnionFind
{
  // par[i]????????????i????±?????????¨??????????????????i == par[i]?????¨???????????????i?????¨?????????????????§??????
  vector<int> par;
  // sizes[i]???????????????i?????¨?????????????????????????????°???i?????????????????§????????´???????????????????????¨??????
  vector<int> sizes;

  UnionFind(int n) : par(n), sizes(n, 1) {
    // ???????????¨???????????????i?????°?????????i????????¨??????????????¨???????????????
    REP(i, n) par[i] = i;
  }

  // ?????????x????±?????????¨???????????????
  int find(int x) {
    if (x == par[x]) return x;
    return par[x] = find(par[x]);  // ????????????????????????????????°???????????????????????¢???
  }

  // 2???????????????x, y????±?????????¨??????????????????
  void unite(int x, int y) {
    // ?????????????????????????????????
    x = find(x);
    y = find(y);

    // ??¢???????????¨????±?????????????????????????????????????
    if (x == y) return;

    // x?????¨???y?????¨????????§???????????????????????????
    if (sizes[x] < sizes[y]) swap(x, y);

    // x???y??????????????????????????£?????????
    par[y] = x;
    sizes[x] += sizes[y];
    // sizes[y] = 0;  // sizes[y]????????????????????¨???????????§0?????\????????????????????????
  }

  // 2???????????????x, y????±?????????¨???????????????true?????????
  bool same(int x, int y) {
    return find(x) == find(y);
  }

  // ?????????x?????????????????¨?????§???????????????
  int size(int x) {
    return sizes[find(x)];
  }
};

// ??????a, b?????????????????????cost??????????????????
struct Edge
{
  int a, b;
  int cost;

  // ??????????????§?°???§????????????
  bool operator<(const Edge& o) const {
    return cost < o.cost;
  }
};

// ????????°??¨?????????????????¨????????????????????°??????
struct Graph
{
  int n;  // ????????°
  vector<Edge> es;  // ?????????

  // ????????????????????§??????????°???¨?????¨??????????????????????¨??????????
  // ??°??????????????£????????¨??????????°???¨????£?????????????????????¨??????
  int kruskal() {
    UnionFind uf(n);

    int cnt = 0;
    int ma;
    REP(ei, es.size()) {
      Edge& e = es[ei];
      if (!uf.same(e.a, e.b)) {
        uf.unite(e.a, e.b);
        ma = e.cost;
        cnt++;
      }
    }

    if (cnt == N-1) {
        return ma - es[0].cost;
    } else {
        return INF;
    }
  }
};

int main() {
    while (cin >> N >> M, N|M) {
        Graph G;
        G.n = N;
        REP(i, M) {
            int a, b, w;
            cin >> a >> b >> w;
            a--;
            b--;
            G.es.push_back({a, b, w});
        }
        SORT(G.es);
        int ans = INF;
        while (G.es.size() > 0) {
            int slim = G.kruskal();
            if (slim == INF) break;
            ans = min(ans, slim);
            G.es.erase(G.es.begin());
        }
        cout << (ans != INF ? ans : -1) << endl;
    }
}

Measured memory_bytes: 3136