#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std; //hdu4378
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define mp push_back
int n,m;
int times;
int top;
int sccnum;
const int N = 1010;
const int M = 1010 * 1010;
struct Edge
{
int to,next,w,id;
}edge[M];
struct Bridge
{
int u,v,w;
}bri[M];
int brinum;
int len;
int vis[N];
int low[N];
bool inst[N];
int myst[N];
int H[N];
void addedge(int u,int v,int w,int id)
{
edge[len].to = v;
edge[len].w = w;
edge[len].id = id;
edge[len].next = H[u];
H[u] = len++;
}
void tarjan(int u,int ei)
{
vis[u] = low[u] = ++times;
inst[u] = true;
myst[top++] = u;
for(int i=H[u];~i;i=edge[i].next)
{
int v = edge[i].to;
if(edge[i].id == ei) continue;
if(vis[v] == -1)
{
tarjan(v,edge[i].id);
low[u] = min(low[u],low[v]);
if(low[v] > vis[u])
{
bri[brinum].u = u;
bri[brinum].v = v;
bri[brinum].w = edge[i].w;
brinum ++;
}
}
else //if()
{
low[u] = min(low[u],vis[v]);
}
}
int t;
}
void solve(int n)
{
int cnt = 0;
for(int i=1;i<=n;i++)
{
if(vis[i] == -1)
{
tarjan(i,-1);
cnt ++;
if(cnt > 1) break;
}
}
if(cnt > 1)
{
printf("0\n");
return ;
}
if(brinum == 0)
{
printf("-1\n");
return ;
}
int mins = 0x3f3f3f3f;
for(int i=0;i<brinum;i++)
{
mins = min(mins,bri[i].w);
}
if(mins == 0) mins ++;
printf("%d\n",mins);
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n == 0 && m == 0) break;
len = 0;
times = 0;
brinum = 0;
top = 0;
memset(vis,-1,sizeof(vis));
memset(inst,0,sizeof(inst));
memset(H,-1,sizeof(H));
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w,i);
addedge(v,u,w,i);
}
solve(n);
}
return 0;
}