#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 5;
struct Hopcroft_Karp {
  static const int inf = 1e9;
  int n;
  vector<int> matchL, matchR, dist;
  vector<vector<int> > g;
  Hopcroft_Karp(int n)
      : n(n), matchL(n + 1), matchR(n + 1), dist(n + 1), g(n + 1) {}
  void addEdge(int u, int v) { g[u].push_back(v); }
  bool bfs() {
    queue<int> q;
    for (int u = 1; u <= n; u++) {
      if (!matchL[u]) {
        dist[u] = 0;
        q.push(u);
      } else
        dist[u] = inf;
    }
    dist[0] = inf;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (auto v : g[u]) {
        if (dist[matchR[v]] == inf) {
          dist[matchR[v]] = dist[u] + 1;
          q.push(matchR[v]);
        }
      }
    }
    return (dist[0] != inf);
  }
  bool dfs(int u) {
    if (!u) return true;
    for (auto v : g[u]) {
      if (dist[matchR[v]] == dist[u] + 1 && dfs(matchR[v])) {
        matchL[u] = v;
        matchR[v] = u;
        return true;
      }
    }
    dist[u] = inf;
    return false;
  }
  int max_matching() {
    int matching = 0;
    while (bfs()) {
      for (int u = 1; u <= n; u++) {
        if (!matchL[u])
          if (dfs(u)) matching++;
      }
    }
    return matching;
  }
};
struct edge {
  int u, v, d;
  edge(int _u, int _v, int _d) {
    u = _u;
    v = _v;
    d = _d;
  }
};
bool comp(edge &a, edge &b) { return a.d < b.d; }
int N;
bool check(int x, vector<edge> &edges) {
  Hopcroft_Karp hk(N);
  for (auto i : edges) {
    if (i.d > x) break;
    hk.addEdge(i.u, i.v);
  }
  return (hk.max_matching() == N - 1);
}
int32_t main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int i, j;
  int n, m;
  cin >> n >> m;
  vector<edge> edges;
  for (i = 0; i < m; i++) {
    int u, v, d;
    cin >> u >> v >> d;
    edges.emplace_back(u, v, d);
  }
  sort(edges.begin(), edges.end(), comp);
  N = n + 1;
  int left = 1;
  int right = INF;
  while (left < right) {
    int mid = (left + right) / 2;
    if (check(mid, edges))
      right = mid;
    else
      left = mid + 1;
  }
  if (left == INF)
    cout << -1 << "\n";
  else
    cout << left << "\n";
  return 0;
}
