#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
const int inf = 2e9;
vector<pair<int, int>> mp[maxn];
int Mx[maxn], My[maxn];
int dx[maxn], dy[maxn];
int dis, mid;
int Nx, Ny;
bool vis[maxn];
bool SearchP() {
  queue<int> Q;
  dis = inf;
  memset(dx, -1, sizeof(dx));
  memset(dy, -1, sizeof(dy));
  for (int i = 1; i <= Nx; i++)
    if (Mx[i] == -1) {
      Q.push(i);
      dx[i] = 0;
    }
  while (!Q.empty()) {
    int x = Q.front();
    Q.pop();
    if (dx[x] > dis) break;
    for (int i = 0; i < mp[x].size(); i++) {
      int y = mp[x][i].first;
      if (mp[x][i].second > mid) continue;
      if (dy[y] == -1) {
        dy[y] = dx[x] + 1;
        if (My[y] == -1)
          dis = dy[y];
        else {
          dx[My[y]] = dy[y] + 1;
          Q.push(My[y]);
        }
      }
    }
  }
  return dis != inf;
}
bool DFS(int x) {
  for (int i = 0; i < mp[x].size(); i++) {
    int y = mp[x][i].first;
    if (mp[x][i].second > mid) continue;
    if (!vis[y] && dy[y] == dx[x] + 1) {
      vis[y] = true;
      if (My[y] != -1 && dy[y] == dis) continue;
      if (My[y] == -1 || DFS(My[y])) {
        My[y] = x;
        Mx[x] = y;
        return true;
      }
    }
  }
  return false;
}
int MaxMatch() {
  int res = 0;
  memset(Mx, -1, sizeof(Mx));
  memset(My, -1, sizeof(My));
  while (SearchP()) {
    memset(vis, false, sizeof(vis));
    for (int i = 1; i <= Nx; i++)
      if (Mx[i] == -1 && DFS(i)) res++;
  }
  return res;
}
int main() {
  int n, m, Max = 1;
  cin >> n >> m;
  for (int i = 1, x, y, z; i <= m; i++) {
    cin >> x >> y >> z;
    mp[x].push_back({y, z});
    Max = max(Max, z);
  }
  Nx = Ny = n;
  int l = 1, r = Max, ans = -1;
  while (l <= r) {
    mid = l + r >> 1;
    if (MaxMatch() == n)
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  cout << ans << endl;
}
