#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e5 + 1;
const long long INF = 1e18;
const long long MOD = 1e9 + 7;
vector<vector<pair<int, int>>> f, a;
int n, k, m;
vector<vector<int>> g;
vector<int> mt;
vector<char> used;
bool try_kuhn(int v) {
  if (used[v]) return false;
  used[v] = true;
  for (size_t i = 0; i < g[v].size(); ++i) {
    int to = g[v][i];
    if (mt[to] == -1 || try_kuhn(mt[to])) {
      mt[to] = v;
      return true;
    }
  }
  return false;
}
bool check(long long del) {
  g.clear();
  g.resize(n);
  k = 0;
  for (size_t i = 0; i < f.size(); ++i) {
    for (auto &[v, d] : f[i]) {
      if (d <= del) {
        k++;
        g[i].emplace_back(v);
      }
    }
  }
  mt.assign(n, -1);
  vector<char> used1(n);
  for (int i = 0; i < n; ++i)
    for (size_t j = 0; j < g[i].size(); ++j)
      if (mt[g[i][j]] == -1) {
        mt[g[i][j]] = i;
        used1[i] = true;
        break;
      }
  for (int i = 0; i < n; ++i) {
    if (used1[i]) continue;
    used.assign(n, false);
    try_kuhn(i);
  }
  for (int i = 0; i < n; ++i) {
    if (mt[i] == -1) {
      return false;
    }
  }
  return true;
}
void solve() {
  cin >> n >> m;
  f.resize(n);
  vector<int> a;
  for (int i = 0; i < m; ++i) {
    long long u, v, d;
    cin >> u >> v >> d;
    u--, v--;
    f[u].emplace_back(v, d);
    a.emplace_back(d);
  }
  sort(a.begin(), a.end());
  long long l = 0, r = a.size();
  while (r - l > 1) {
    long long mid = (r + l) / 2;
    if (check(a[mid])) {
      r = mid;
    } else {
      l = mid;
    }
  }
  if (l != a.size() && check(a[l])) {
    cout << a[l] << '\n';
  } else if (r != a.size() && check(a[r])) {
    cout << a[r] << "\n";
  } else {
    cout << "-1\n";
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
  int test = 1;
  for (int i = 1; i <= test; ++i) {
    solve();
  }
  return 0;
}
