#include <bits/stdc++.h>
using namespace std;
const int N = 20010, M = 3e5 + 5, inf = 99999999;
int fst[N * 2], nxt[M], u[M], v[M], flow[M], tot = 1;
int cur[N * 2], dis[N * 2], inq[N * 2], cnt;
int que[N << 1];
int s = 0, tt = N - 1;
int n, m;
struct aa {
  int u, v, w;
  bool operator<(const aa &b) const { return w < b.w; }
} e[M];
void add(int lu, int lv, int lf) {
  u[++tot] = lu, v[tot] = lv, flow[tot] = lf, nxt[tot] = fst[lu], fst[lu] = tot;
  u[++tot] = lv, v[tot] = lu, flow[tot] = 0, nxt[tot] = fst[lv], fst[lv] = tot;
}
bool bfs() {
  int h, t;
  memset(dis, 0x3f, sizeof(dis)), dis[s] = 0, que[h = t = 1] = s;
  while (h <= t) {
    int lx = que[h++];
    for (int i = fst[lx]; i; i = nxt[i])
      if (flow[i] && dis[v[i]] > dis[lx] + 1) {
        dis[v[i]] = dis[lx] + 1, que[++t] = v[i];
        if (v[i] == tt) return 1;
      }
  }
  return dis[tt] < inf;
}
int dfs(int lx, int low, int t) {
  if (lx == t) return low;
  int res = 0, zl;
  for (int &i = cur[lx]; i; i = nxt[i])
    if (dis[v[i]] == dis[lx] + 1 && flow[i] &&
        (zl = dfs(v[i], min(low, flow[i]), t))) {
      res += zl, low -= zl, flow[i] -= zl, flow[i ^ 1] += zl;
      if (!low) return res;
    }
  return res;
}
int dinic() {
  int ans = 0;
  while (bfs()) memcpy(cur, fst, sizeof(cur)), ans += dfs(s, inf, tt);
  return ans;
}
bool check(int x) {
  memset(fst, 0, sizeof(fst)), tot = 1;
  for (int i = 1; i <= x; i++) add(e[i].u, n + e[i].v, 1);
  for (int i = 1; i <= n; i++) add(s, i, 1), add(i + n, tt, 1);
  return dinic() == n;
}
int main() {
  int i, j;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= m; i++) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
  sort(e + 1, e + m + 1);
  int pl = 1, pr = m + 1;
  while (pl < pr) {
    int mid = (pl + pr) >> 1;
    if (!check(mid))
      pl = mid + 1;
    else
      pr = mid;
  }
  if (pl > m)
    cout << -1;
  else
    cout << e[pl].w;
  return 0;
}
