#include <bits/stdc++.h>
using namespace std;
deque<pair<int, pair<int, int>>> agregar;
vector<int> g[10003];
int n, m;
int mt[10003], mt2[10003], ds[10003];
bool bfs() {
  queue<int> q;
  memset(ds, -1, sizeof(ds));
  for (int i = (0); i < (n); i++)
    if (mt2[i] < 0) ds[i] = 0, q.push(i);
  bool r = false;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int y : g[x]) {
      if (mt[y] >= 0 && ds[mt[y]] < 0)
        ds[mt[y]] = ds[x] + 1, q.push(mt[y]);
      else if (mt[y] < 0)
        r = true;
    }
  }
  return r;
}
bool dfs(int x) {
  for (int y : g[x])
    if (mt[y] < 0 || ds[mt[y]] == ds[x] + 1 && dfs(mt[y])) {
      mt[y] = x;
      mt2[x] = y;
      return true;
    }
  ds[x] = 1 << 30;
  return false;
}
int mm() {
  int r = 0;
  memset(mt, -1, sizeof(mt));
  memset(mt2, -1, sizeof(mt2));
  while (bfs()) {
    for (int i = (0); i < (n); i++)
      if (mt2[i] < 0) r += dfs(i);
  }
  return r;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  m = n;
  int a;
  cin >> a;
  for (int i = (0); i < (a); i++) {
    int u, v, d;
    cin >> u >> v >> d;
    u--;
    v--;
    agregar.push_back(make_pair(d, make_pair(u, v)));
  }
  sort(agregar.begin(), agregar.end());
  auto last = agregar.end();
  last--;
  int L = 0, R = last->first + 2;
  while (L < R) {
    int M = (L + R) / 2;
    for (int i = (0); i < (n); i++) g[i].clear();
    for (auto it = agregar.begin(); it != agregar.end(); it++) {
      if (it->first <= M)
        g[it->second.first].push_back(it->second.second);
      else
        break;
    }
    if (mm() == n)
      R = M;
    else
      L = M + 1;
  }
  if (L == last->first + 2)
    cout << "-1\n";
  else
    cout << L << "\n";
  return 0;
}
