#include <bits/stdc++.h>
using namespace std;
queue<int> q;
const int maxn = 40007;
const int maxm = 800007;
const int inf = 0x7f7f7f7f;
struct E {
  int u, v, w, cf;
} e[maxm];
int first[maxn], nt[maxm], ES = 1;
bool acc[maxm];
inline void addE(int u, int v, int w, int cf) {
  e[++ES] = (E){u, v, w, cf};
  nt[ES] = first[u];
  first[u] = ES;
  return;
}
inline void add(int u, int v, int w) {
  addE(u, v, w, 1);
  addE(v, u, w, 0);
  return;
}
int tot;
int N, M;
int cur[maxn];
int dep[maxn];
int S, T;
bool BFS() {
  memset(dep, 0, sizeof(dep));
  dep[S] = 1;
  q.push(S);
  int u, v;
  while (!q.empty()) {
    u = q.front();
    q.pop();
    for (int i = first[u]; i; i = nt[i]) {
      v = e[i].v;
      if (e[i].cf > 0 && acc[i] && !dep[v]) {
        dep[v] = dep[u] + 1;
        q.push(v);
      }
    }
  }
  return dep[T] != 0;
}
int dfs(int u, int f) {
  if (u == T) return f;
  int v, d, sum = 0;
  for (int &i = cur[u]; i; i = nt[i]) {
    v = e[i].v;
    if (dep[v] == dep[u] + 1 && e[i].cf > 0 && acc[i]) {
      d = dfs(v, min(f, e[i].cf));
      if (d > 0) {
        sum += d;
        f -= d;
        e[i].cf -= d;
        e[i ^ 1].cf += d;
        if (f <= 0) return sum;
      }
    }
  }
  return sum;
}
int solve() {
  int re = 0;
  while (BFS()) {
    memcpy(cur, first, sizeof(first));
    re += dfs(S, inf);
  }
  return re;
}
bool check(int p) {
  for (int i = 1; i <= ES; i++) {
    if (e[i].w <= p)
      acc[i] = true;
    else
      acc[i] = false;
    e[i].cf = (i & 1) ^ 1;
  }
  return solve() == N;
}
int main() {
  scanf("%d%d", &N, &M);
  int u, v, w;
  int L = 0, R = 0, mid, ans = -1;
  for (int i = 1; i <= M; i++) scanf("%d%d%d", &u, &v, &w), add(u, v + N, w);
  S = 0;
  T = 2 * N + 1;
  for (int i = 1; i <= N; i++) add(S, i, -1), add(i + N, T, -1);
  R = 1e9;
  while (L <= R) {
    mid = L + R >> 1;
    if (check(mid))
      ans = mid, R = mid - 1;
    else
      L = mid + 1;
  }
  printf("%d", ans);
  return 0;
}
