#include <bits/stdc++.h>
using namespace std;
const int N = 20005;
const int M = 240005;
const int INF = 0x3f3f3f3f;
int n, m, S, T;
int h[N], e[M], w[M], ne[M], idx;
int d[N], cur[N], q[N], hh, tt;
struct Edge {
  int a, b, w;
} edge[M >> 1];
void addedge(int a, int b, int c) {
  e[++idx] = b;
  w[idx] = c;
  ne[idx] = h[a];
  h[a] = idx;
}
void add(int a, int b, int c) { addedge(a, b, c), addedge(b, a, 0); }
void build(int x) {
  memset(h, 0, sizeof h), idx = 1;
  for (int i = 1; i <= n; i++) add(S, i, 1), add(i + n, T, 1);
  for (int i = 0; i < m; i++)
    if (edge[i].w <= x) add(edge[i].a, edge[i].b + n, 1);
}
bool bfs() {
  memset(d, 0, sizeof d);
  d[S] = 1, cur[S] = h[S];
  *q = S, hh = tt = 0;
  while (hh <= tt) {
    int t = q[hh++];
    for (int i = h[t]; i; i = ne[i])
      if (!d[e[i]] && w[i]) {
        d[e[i]] = d[t] + 1;
        cur[e[i]] = h[e[i]];
        if (e[i] == T) return true;
        q[++tt] = e[i];
      }
  }
  return false;
}
int find(int u, int limit) {
  if (u == T) return limit;
  int flow = 0;
  for (int i = cur[u]; i && flow < limit; i = ne[i]) {
    cur[u] = i;
    if (d[e[i]] == d[u] + 1 && w[i]) {
      int t = find(e[i], min(w[i], limit - flow));
      if (!t) d[e[i]] = 0;
      w[i] -= t, w[i ^ 1] += t, flow += t;
    }
  }
  return flow;
}
int dinic(int x) {
  int flow = 0;
  build(x);
  while (bfs()) flow += find(S, INF);
  return flow;
}
int main() {
  scanf("%d%d", &n, &m);
  S = 0, T = n << 1 | 1;
  int l = 0, r = 0, mid;
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d", &edge[i].a, &edge[i].b, &edge[i].w);
    if (r < edge[i].w) r = edge[i].w;
  }
  while (l < r) {
    mid = l + r >> 1;
    if (dinic(mid) == n)
      r = mid;
    else
      l = mid + 1;
  }
  if (dinic(r) == n)
    printf("%d\n", r);
  else
    puts("-1");
  return 0;
}
