#include <bits/stdc++.h>
#define pii pair<int, int>
#define piii pair<int,pii>
#define f first
#define s second
using namespace std;

vector<piii> edges;
int par[107];

void reset( int n )
{
    for( int i=1; i<=n; i++ )
        par[i]= i;
}

int Find( int u )
{
    if( par[u]==u )
        return u;
    return par[u]= Find( par[u] );
}

void unite( int u, int v )
{
    int paru= Find( u );
    int parv= Find( v );

    if( paru!=parv )
        par[paru]= parv;
}

int main()
{
    int n,m;

    while( scanf("%d %d", &n, &m)==2 and (n+m) )
    {
        for( int i=0; i<m; i++ )
        {
            int p,q,w;
            scanf("%d %d %d", &p, &q, &w);

            edges.push_back( piii( w, pii( p,q ) ) );
        }

        sort( edges.begin(), edges.end() );

        int diff= 1e9;

        for( int i=0; i<m; i++ )
        {
            if( m-i<n-1 )
                break;
            reset(n);
            vector<bool> vis( n+1,0 );
            int cnt= 0;

            int mx= -1e9, mn= 1e9, thisdiff= 0;

            for( int j=i; j<m; j++ )
            {
                int u= edges[j].s.f;
                int v= edges[j].s.s;

                if( !vis[u] )
                    vis[u]= 1;
                if( !vis[v] )
                    vis[v]= 1;

                if( Find(u)!=Find(v) )
                {
                    unite(u,v);
                    mn= min( mn, edges[j].f );
                    mx= max( mx, edges[j].f );
                }
            }

            thisdiff= mx-mn;
            bool f= 1;

            for( int i=1; i<=n; i++ )
            {
                if(!vis[i])
                {
                    f= 0;
                    break;
                }

                if( vis[i] and Find(i)==i )
                    cnt++;
            }

            if( f and cnt==1 )
                diff= min( diff, thisdiff );
        }

        if(diff==1e9)
            diff= -1;

        printf("%d\n", diff);

        edges.clear();
    }
}
