#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 100;
const int maxm = 1e6 + 100;
const int INF = 1 << 30;
struct Edge {
  int u, v, w, f, next;
} e[maxm], tmp[maxm];
int head[maxn], tot = 1;
void addEdge(int u, int v, int f, int w) {
  e[++tot].u = u;
  e[tot].v = v;
  e[tot].f = f;
  e[tot].w = w;
  e[tot].next = head[u];
  head[u] = tot;
  e[++tot].u = v;
  e[tot].v = u;
  e[tot].f = 0;
  e[tot].w = w;
  e[tot].next = head[v];
  head[v] = tot;
}
int n, m;
long long limit;
queue<int> q;
int dep[maxn];
int s, t;
bool bfs() {
  while (!q.empty()) q.pop();
  memset(dep, 0, sizeof(dep));
  dep[s] = 1;
  q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = e[i].next) {
      int v = e[i].v;
      if (e[i].w > limit) continue;
      if (!dep[v] && e[i].f > 0) {
        dep[v] = dep[u] + 1;
        q.push(v);
        if (v == t) return true;
      }
    }
  }
  return false;
}
int dfs(int u, int flow) {
  if (u == t) return flow;
  int ans = 0;
  for (int i = head[u]; i; i = e[i].next) {
    int v = e[i].v;
    if (e[i].w > limit) continue;
    if (e[i].f > 0 && dep[v] == dep[u] + 1) {
      int x = dfs(v, min(flow - ans, e[i].f));
      e[i].f -= x;
      e[i ^ 1].f += x;
      ans += x;
      if (ans == flow) break;
    }
  }
  if (!ans) dep[u] = -2;
  return ans;
}
bool check(long long k) {
  limit = k;
  int ans = 0;
  memcpy(e, tmp, sizeof(tmp));
  while (bfs()) {
    ans += dfs(s, INF);
  }
  return ans == n;
}
int W[maxn], cnt;
int main() {
  scanf("%d%d", &n, &m);
  int N = 2 * n;
  s = N * 2 + 1;
  t = s + 1;
  for (int i = 1; i <= n; i++) {
    addEdge(s, i, INF, 0);
    addEdge(i, i + N, 1, 0);
  }
  for (int i = n + 1; i <= N; i++) {
    addEdge(i + N, t, INF, 0);
    addEdge(i, i + N, 1, 0);
  }
  for (int i = 1; i <= m; i++) {
    long long u, v, w;
    scanf("%lld%lld%lld", &u, &v, &w);
    addEdge(u + N, v + n, 1, w);
    W[++cnt] = w;
  }
  sort(W + 1, W + 1 + cnt);
  cnt = unique(W + 1, W + 1 + cnt) - W - 1;
  long long ans = -1;
  long long l = 1, r = cnt, mid;
  memcpy(tmp, e, sizeof(e));
  if (!check(W[cnt])) {
    printf("-1");
    return 0;
  }
  while (l <= r) {
    mid = (l + r) >> 1;
    if (check(W[mid])) {
      ans = W[mid];
      r = mid - 1;
    } else
      l = mid + 1;
  }
  printf("%lld", ans);
  return 0;
}
