#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 10000;
vector<pair<int, int>> graph[MAX_N + 1];
queue<int> q;
int n;
int mx[MAX_N + 1], my[MAX_N + 1];
int lvl[MAX_N + 1];
int finlev, cut;
bool bfs() {
  bool res = false;
  int now, sz, target;
  finlev = n + 100;
  while (!q.empty()) q.pop();
  for (int i = 1; i <= n; i++) {
    if (mx[i] < 0) {
      lvl[i] = 0;
      q.push(i);
    } else {
      lvl[i] = finlev;
    }
  }
  while (!q.empty()) {
    now = q.front();
    q.pop();
    sz = graph[now].size();
    if (lvl[now] > finlev) break;
    for (int i = 0; i < sz; i++) {
      if (graph[now][i].first > cut) continue;
      target = my[graph[now][i].second];
      if (target < 0) {
        finlev = lvl[now];
      } else if (lvl[target] == n + 100) {
        lvl[target] = lvl[now] + 1;
        q.push(target);
      }
    }
  }
  return (finlev < (n + 100));
}
int dfs(int now) {
  int sz = graph[now].size(), target;
  for (int i = 0; i < sz; i++) {
    if (graph[now][i].first > cut) continue;
    int target = my[graph[now][i].second];
    if (target < 0) {
      my[graph[now][i].second] = now;
      mx[now] = graph[now][i].second;
      return 1;
    } else if (lvl[target] == lvl[now] + 1) {
      if (dfs(target)) {
        my[graph[now][i].second] = now;
        mx[now] = graph[now][i].second;
        return 1;
      }
    }
  }
  lvl[now] = n + 100;
  return 0;
}
int hopcroft() {
  int matching = 0;
  for (int i = 1; i <= MAX_N; i++) {
    mx[i] = -1;
    my[i] = -1;
  }
  while (bfs()) {
    for (int i = 1; i <= n; i++) {
      if (lvl[i] == 0) matching += dfs(i);
    }
  }
  return matching;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v, d;
    cin >> u >> v >> d;
    graph[u].emplace_back(d, v);
  }
  cut = (int)1e9 + 2;
  if (hopcroft() != n) {
    cout << "-1\n";
    return 0;
  }
  int l = 0, r = (int)1e9 + 2;
  while (l + 1 < r) {
    cut = (l + r - 1) / 2;
    memset(mx, 0, sizeof(mx));
    memset(my, 0, sizeof(my));
    memset(lvl, 0, sizeof(lvl));
    q = queue<int>();
    finlev = 0;
    if (hopcroft() == n)
      r = cut + 1;
    else
      l = cut + 1;
  }
  cout << l << "\n";
  return 0;
}
