#include <bits/stdc++.h>
using namespace std;
const int M = 200005;
int n, m, tot, ans;
struct Node {
  int u, v, w;
} node[M];
int vis[M], match[M];
int sum1[M], sum2[M];
int head[M], Nxt[M], ver[M];
bool v[M], flag = 0;
vector<int> e[M];
inline bool dfs(long long x) {
  for (int i = 0; i < e[x].size(); i++) {
    long long y = e[x][i];
    if (!vis[y]) {
      vis[y] = 1;
      if (!match[y] || dfs(match[y])) {
        match[y] = x;
        return 1;
      }
    }
  }
  return 0;
}
bool cmp(Node a, Node b) { return a.w > b.w; }
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &node[i].u, &node[i].v, &node[i].w);
    sum1[node[i].u]++;
    sum2[node[i].v]++;
    e[node[i].u].push_back(node[i].v);
  }
  for (int i = 1; i <= n; i++) {
    memset(vis, 0, sizeof(vis));
    if (dfs(i)) ans++;
  }
  if (ans != n) {
    printf("-1\n");
    return 0;
  }
  sort(node + 1, node + 1 + m, cmp);
  for (int i = 1; i <= m; i++) {
    sum1[node[i].u]--;
    sum2[node[i].v]--;
    if (sum1[node[i].u] == 0 || sum2[node[i].v] == 0) {
      printf("%d\n", node[i].w);
      return 0;
    }
  }
  return 0;
}
