#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e9;
const long long inf64 = 1e18;
const long long MOD = inf + 7;
struct bimatch {
  long long n;
  vector<vector<long long>> G;
  vector<long long> match;
  vector<bool> used;
  bimatch(long long _n = 0) : n(_n), G(n), match(n), used(n) {}
  void add_edge(long long u, long long v) {
    G[u].push_back(v);
    G[v].push_back(u);
  }
  bool dfs(long long v) {
    used[v] = true;
    for (long long u : G[v]) {
      long long w = match[u];
      if (w < 0 || !used[w] && dfs(w)) {
        match[v] = u;
        match[u] = v;
        return true;
      }
    }
    return false;
  }
  long long count() {
    long long ans = 0;
    bool flag = true;
    fill(match.begin(), match.end(), -1);
    while (flag) {
      flag = false;
      fill(used.begin(), used.end(), false);
      for (long long v = 0; v < n; v++)
        if (match[v] < 0 && dfs(v)) ans++, flag = true;
    }
    return ans;
  }
};
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m;
  cin >> n >> m;
  long long ans = -1;
  vector<pair<long long, pair<long long, long long>>> v(m);
  vector<long long> cost(m);
  for (long long i = 0; i < m; i++) {
    cin >> v[i].first >> v[i].second.first >> v[i].second.second;
    cost[i] = v[i].second.second;
  }
  sort((cost).begin(), (cost).end());
  long long low = 0, high = m - 1;
  while (low <= high) {
    long long mid = (low + high) / 2;
    bimatch B(n + n + 2);
    for (long long i = 0; i < m; i++)
      if (v[i].second.second <= cost[mid])
        B.add_edge(v[i].first, v[i].second.first + n);
    if (B.count() == n) {
      ans = cost[mid];
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  cout << ans << "\n";
}
