#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
long double PI = acosl(-1);
const long long infl = 1e18;
const int nmax = 1e6 + 5;
const int MAXLG = log2(nmax) + 1;
const int N = 2e4 + 5;
struct Hopcroft_Karp {
  int NIL = 0, INF = (1 << 28), match[N], dist[N], n, m;
  vector<int> G[N];
  void init(int lft, int rgt) {
    n = lft, rgt = m;
    for (int i = 0; i <= n + m + 1; i++) G[i].clear();
  }
  void addEdge(int u, int v) { G[u].push_back(v + n); }
  bool bfs() {
    queue<int> Q;
    for (int i = 1; i <= n; i++) {
      if (match[i] == NIL)
        dist[i] = 0, Q.push(i);
      else
        dist[i] = INF;
    }
    dist[NIL] = INF;
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      if (u != NIL) {
        for (int i = 0; i < G[u].size(); i++) {
          int v = G[u][i];
          if (dist[match[v]] == INF) {
            dist[match[v]] = dist[u] + 1;
            Q.push(match[v]);
          }
        }
      }
    }
    return (dist[NIL] != INF);
  }
  bool dfs(int u) {
    if (u != NIL) {
      for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (dist[match[v]] == dist[u] + 1) {
          if (dfs(match[v])) {
            match[v] = u;
            match[u] = v;
            return true;
          }
        }
      }
      dist[u] = INF;
      return false;
    }
    return true;
  }
  int hopcroft_karp() {
    memset(dist, 0, sizeof dist);
    memset(match, 0, sizeof match);
    int matching = 0;
    while (bfs()) {
      for (int i = 1; i <= n; i++) {
        if (match[i] == NIL && dfs(i)) {
          matching++;
        }
      }
    }
    return matching;
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  Hopcroft_Karp carp;
  int n, m;
  cin >> n >> m;
  vector<pair<int, pair<int, int> > > ejes;
  for (int i = 0; i < m; i++) {
    int u, v, d;
    cin >> u >> v >> d;
    ejes.push_back({d, {u, v}});
  }
  carp.init(n, n);
  for (pair<int, pair<int, int> > pp : ejes) {
    carp.addEdge(pp.second.first, pp.second.second);
  }
  int z = carp.hopcroft_karp();
  if (z != n) cout << "-1\n", exit(0);
  sort(ejes.begin(), ejes.end());
  int lo = 1, hi = 1000000000;
  while (hi > lo) {
    int mid = (hi + lo) / 2;
    carp.init(n, n);
    for (auto pp : ejes) {
      if (pp.first > mid) break;
      carp.addEdge(pp.second.first, pp.second.second);
    }
    if (carp.hopcroft_karp() == n)
      hi = mid;
    else
      lo = mid + 1;
  }
  cout << lo << endl;
}
