#include <bits/stdc++.h>
using namespace std;
long long U[10001], V[10000], dis[10000];
long long n, m;
vector<long long> adj[10001];
bool bfs() {
  queue<long long> q;
  for (long long i = 1; i <= n; i++) {
    if (U[i] == 0) {
      dis[i] = 0;
      q.push(i);
    } else
      dis[i] = INT_MAX;
  }
  dis[0] = INT_MAX;
  while (!q.empty()) {
    long long x = q.front();
    q.pop();
    if (dis[x] < dis[0]) {
      for (long long j = 0; j < adj[x].size(); j++) {
        if (dis[V[adj[x][j]]] == INT_MAX) {
          dis[V[adj[x][j]]] = dis[x] + 1;
          q.push(V[adj[x][j]]);
        }
      }
    }
  }
  return (dis[0] != INT_MAX);
}
bool dfs(long long u) {
  if (u != 0) {
    for (long long j = 0; j < adj[u].size(); j++) {
      if (dis[V[adj[u][j]]] == (dis[u] + 1)) {
        if (dfs(V[adj[u][j]])) {
          V[adj[u][j]] = u;
          U[u] = adj[u][j];
          return true;
        }
      }
    }
    dis[u] = INT_MAX;
    return false;
  }
  return true;
}
long long hopcroft() {
  for (long long i = 0; i <= 10000; i++) {
    U[i] = 0;
    V[i] = 0;
  }
  long long ans = 0;
  while (bfs()) {
    for (long long u = 1; u <= n; u++) {
      if (U[u] == 0 && dfs(u)) ans++;
    }
  }
  return ans;
}
void solve() {
  cin >> n >> m;
  vector<pair<long long, pair<long long, long long> > > edges;
  for (long long i = 0; i < m; i++) {
    long long a, b, c;
    cin >> a >> b >> c;
    edges.push_back({c, {a, b}});
  }
  long long l = 0, r = 1000000000, f = -1;
  while (l <= r) {
    long long mid = (l + r) / 2;
    for (long long i = 1; i <= n; i++) adj[i].clear();
    for (auto x : edges) {
      if (x.first <= mid) {
        adj[x.second.first].push_back(x.second.second);
      }
    }
    if (hopcroft() == n) {
      r = mid - 1;
      f = mid;
    } else
      l = mid + 1;
  }
  cout << f << "\n";
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long test = 0, t;
  t = 1;
  while (test++ < t) {
    solve();
  }
}
