#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > Adj[20005];
int n, m, match[20005], dist[20005], u, v, mid;
bool bfs() {
  queue<int> Q;
  for (int i = 1; i <= n; ++i) {
    if (match[i] == 0) {
      dist[i] = 0;
      Q.push(i);
    } else
      dist[i] = 1000000007;
  }
  dist[0] = 1000000007;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    if (u != 0) {
      for (auto v : Adj[u]) {
        if (v.second > mid) continue;
        if (dist[match[v.first]] == 1000000007) {
          dist[match[v.first]] = dist[u] + 1;
          Q.push(match[v.first]);
        }
      }
    }
  }
  return (dist[0] != 1000000007);
}
bool dfs(int u) {
  if (u != 0) {
    for (auto v : Adj[u]) {
      if (v.second > mid) continue;
      if (dist[match[v.first]] == dist[u] + 1) {
        if (dfs(match[v.first])) {
          match[v.first] = u;
          match[u] = v.first;
          return true;
        }
      }
    }
    dist[u] = 1000000007;
    return false;
  }
  return true;
}
bool check() {
  memset(match, 0, sizeof(match));
  memset(dist, 0, sizeof(dist));
  int matching = 0;
  while (bfs())
    for (int i = 1; i <= n; i++)
      if (match[i] == 0 && dfs(i)) matching++;
  return matching == n;
}
int main() {
  ios_base::sync_with_stdio(NULL);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    int u, v, w;
    cin >> u >> v >> w;
    Adj[u].push_back({v + n, w});
    Adj[v + n].push_back({u, w});
  }
  int l = 0;
  int r = 1000000001;
  while (l < r - 1) {
    mid = (l + r) >> 1;
    if (check())
      r = mid;
    else
      l = mid;
  }
  cout << ((r == 1000000001) ? -1 : r) << '\n';
  return 0;
}
