#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
const long long mod = 998244353;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int n, m;
int p[N];
int cnt;
int used[N];
vector<int> g[N], ord;
vector<pair<int, pair<int, int> > > v;
bool dfs(int x) {
  if (used[x]) return false;
  used[x] = true;
  ord.push_back(x);
  for (auto y : g[x]) {
    if (p[y] == -1 || dfs(p[y])) {
      cnt += (p[y] == -1);
      p[y] = x;
      return true;
    }
  }
  return false;
}
bool can(int x) {
  cnt = 0;
  for (int i = 1; i <= 2 * n; i++) {
    p[i] = -1;
    g[i].clear();
  }
  for (int i = 0; i < m; i++) {
    if (v[i].first <= x) {
      g[v[i].second.first].push_back(v[i].second.second);
      used[v[i].second.second] += 1;
    }
  }
  int f = 0;
  for (int i = n + 1; i <= n + n; i++) {
    f += (used[i] > 1);
    if (!used[i]) return false;
    used[i] = false;
  }
  for (int i = 1; i <= n; i++) {
    if (g[i].empty()) {
      return false;
    }
    random_shuffle(g[i].begin(), g[i].end());
  }
  if (f == n) return true;
  vector<int> ord1;
  for (int i = 1; i <= n; i++) ord1.push_back(i);
  random_shuffle(ord1.begin(), ord1.end());
  for (int it = 0; it < n; it++) {
    int i = ord1[it];
    for (auto x : ord) used[x] = false;
    ord.clear();
    dfs(i);
  }
  return (cnt == n);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    cin >> x >> y >> z;
    v.push_back({z, {x, y + n}});
  }
  sort(v.begin(), v.end());
  int l = 0, r = m - 1;
  while (l < r) {
    int m = (l + r) / 2;
    if (can(v[m].first))
      r = m;
    else
      l = m + 1;
  }
  if (!can(v[l].first)) {
    cout << -1;
  } else
    cout << v[l].first;
}
