#include <bits/stdc++.h>
using namespace std;
template <class T>
using min_pq = priority_queue<T, vector<T>, greater<T>>;
const int MAXN = 1e5 + 10, MAXQ = 3e5 + 10, MAXL = 20, ALP = 26, MOD = 1e9 + 7,
          MAXK = 17, INF = 1e9 + 10, MAXA = 30, MAXB = 24, MAXBB = (1 << MAXB);
const string no = "NO\n", yes = "YES\n";
const int hA[4] = {1, 0, -1, 0}, kA[4] = {0, 1, 0, -1};
bool dfs(int a, int L, vector<vector<int>>& g, vector<int>& btoa,
         vector<int>& A, vector<int>& B) {
  if (A[a] != L) return 0;
  A[a] = -1;
  for (int b : g[a])
    if (B[b] == L + 1) {
      B[b] = 0;
      if (btoa[b] == -1 || dfs(btoa[b], L + 1, g, btoa, A, B))
        return btoa[b] = a, 1;
    }
  return 0;
}
int hopcroftKarp(vector<vector<int>>& g, vector<int>& btoa) {
  int res = 0;
  vector<int> A(g.size()), B(btoa.size()), cur, next;
  for (;;) {
    fill(begin(A), end(A), 0);
    fill(begin(B), end(B), 0);
    cur.clear();
    for (int a : btoa)
      if (a != -1) A[a] = -1;
    for (int a = 0; a < ((int)g.size()); ++a)
      if (A[a] == 0) cur.push_back(a);
    for (int lay = 1;; lay++) {
      bool islast = 0;
      next.clear();
      for (int a : cur)
        for (int b : g[a]) {
          if (btoa[b] == -1) {
            B[b] = lay;
            islast = 1;
          } else if (btoa[b] != a && !B[b]) {
            B[b] = lay;
            next.push_back(btoa[b]);
          }
        }
      if (islast) break;
      if (next.empty()) return res;
      for (int a : next) A[a] = lay;
      cur.swap(next);
    }
    for (int a = 0; a < ((int)g.size()); ++a) res += dfs(a, 0, g, btoa, A, B);
  }
}
void solve() {
  int n, m;
  cin >> n >> m;
  vector<array<int, 3>> ed(m);
  for (auto& it : ed) cin >> it[1] >> it[2] >> it[0], --it[1], --it[2];
  sort(ed.begin(), ed.end());
  vector<vector<int>> adj(n);
  vector<int> btoa(n);
  auto v = [&](int c) {
    for (int i = 0; i < n; i++) adj[i].clear(), btoa[i] = -1;
    for (int i = 0; i <= c; i++) {
      auto& it = ed[i];
      adj[it[1]].push_back(it[2]);
    };
    return hopcroftKarp(adj, btoa) == n;
  };
  int lo = -1, hi = m, mid = (lo + hi) / 2;
  while (lo < mid && mid < hi) {
    if (v(mid))
      hi = mid;
    else
      lo = mid;
    mid = (lo + hi) / 2;
  }
  if (hi == m)
    cout << -1 << '\n';
  else
    cout << ed[hi][0] << '\n';
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t = 1;
  while (t--) solve();
}
