#include<bits/stdc++.h>
using namespace std;
const int N=500001,M=1000001,T=100001;
int n,m,a[M],b[M],t[M],dfn[N],low[N],tot,stk[N],cnt,e_dcc[N],sum,mn,root1,root2,dp[N],k[N];
bool flag,vis[T];
struct node{
int to,w;
};
vector<node>v[N];
vector<int>ve[N];
void tarjan(int now,int fa){
dfn[now]=low[now]=++tot;
stk[++cnt]=now;
for(int i=0;i<ve[now].size();i++){
int tmp=ve[now][i];
if(!dfn[tmp]){
tarjan(tmp,now);
low[now]=min(low[now],low[tmp]);
if(low[tmp]>dfn[now]){
++sum;
while(stk[cnt]!=tmp){
e_dcc[stk[cnt]]=sum;
--cnt;
}
e_dcc[stk[cnt]]=sum;
--cnt;
}
}
else if(tmp!=fa){
low[now]=min(low[now],dfn[tmp]);
}
}
}
void dfs1(int now,int fa){
int mnn=INT_MAX,tmp3=-1;
for(int i=0;i<v[now].size();i++){
int tmp1=v[now][i].to,tmp2=v[now][i].w;
if(tmp1!=fa){
dfs1(tmp1,now);
if(min(dp[tmp1],tmp2)<mnn){
mnn=min(dp[tmp1],tmp2);
tmp3=tmp1;
}
}
}
dp[now]=mnn;
k[now]=tmp3;
}
void dfs2(int now,int fa){
if(k[now]==-1) return;
for(int i=0;i<v[now].size();i++){
int tmp1=v[now][i].to,tmp2=v[now][i].w;
if(tmp1==k[now]){
vis[tmp2]=1;
dfs2(tmp1,now);
return;
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
memset(dp,0x3f,sizeof(dp));
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i]>>b[i]>>t[i];
ve[a[i]].push_back(b[i]);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i,0);
if(cnt!=0){
++sum;
while(cnt){
e_dcc[stk[cnt]]=sum;
--cnt;
}
}
}
}
mn=INT_MAX;
for(int i=1;i<=m;i++){
if(e_dcc[a[i]]!=e_dcc[b[i]]){
v[e_dcc[a[i]]].push_back({e_dcc[b[i]],t[i]});
v[e_dcc[b[i]]].push_back({e_dcc[a[i]],t[i]});
if(t[i]<mn){
mn=t[i];
root1=e_dcc[a[i]];
root2=e_dcc[b[i]];
}
}
}
dfs1(root1,root2);
dfs1(root2,root1);
sort(t+1,t+m+1);
dfs2(root1,root2);
dfs2(root2,root1);
vis[mn]=1;
for(int i=1;i<=m;i++){
if(!vis[t[i]]){
cout<<t[i]<<" ";
flag=true;
break;
}
}
if(flag==false) cout<<-1;
return 0;
}