#include <bits/stdc++.h>
using namespace std;
const int N = 1e4;
const int MX = 1e9;
const int INF = 2e9;
int n, m;
int matl[N + 2], matr[N + 2], dis[N + 2];
vector<pair<int, int> > adj[N + 2];
bool bfs(int d) {
  queue<int> q;
  for (int i = 1; i <= n; i++) {
    if (matl[i] == 0) {
      dis[i] = 0;
      q.push(i);
    } else
      dis[i] = INF;
  }
  dis[0] = INF;
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    if (dis[cur] >= dis[0]) continue;
    for (auto nx : adj[cur]) {
      if (nx.first > d) break;
      if (dis[matr[nx.second]] == INF) {
        dis[matr[nx.second]] = dis[cur] + 1;
        q.push(matr[nx.second]);
      }
    }
  }
  return dis[0] != INF;
}
bool dfs(int cur, int d) {
  if (cur == 0) return 1;
  for (auto nx : adj[cur]) {
    if (nx.first > d) break;
    if (dis[matr[nx.second]] == dis[cur] + 1) {
      if (dfs(matr[nx.second], d)) {
        matl[cur] = nx.second;
        matr[nx.second] = cur;
        return 1;
      }
    }
  }
  dis[cur] = INF;
  return 0;
}
bool can(int d) {
  memset(matl, 0, sizeof(matl));
  memset(matr, 0, sizeof(matr));
  int cnt = 0;
  while (bfs(d)) {
    for (int i = 1; i <= n; i++) {
      if (matl[i] != 0) continue;
      cnt += dfs(i, d);
    }
  }
  return cnt == n;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v, d;
    cin >> u >> v >> d;
    adj[u].push_back({d, v});
  }
  for (int i = 1; i <= n; i++) {
    sort(adj[i].begin(), adj[i].end());
  }
  int ans = -1;
  for (int l = 1, r = MX; l <= r;) {
    int m = (l + r) / 2;
    if (can(m)) {
      ans = m;
      r = m - 1;
    } else
      l = m + 1;
  }
  cout << ans << '\n';
  return 0;
}
