#include <bits/stdc++.h>
const int N = 10010;
int F[N], n, m, v[N];
int temp[N];
struct tp {
  int a, b, c;
  bool operator<(const tp m) const { return c < m.c; }
} aa[N * 10];
inline int read() {
  int a = 1, b = 0;
  char c = getchar();
  while (c > '9' || c < '0') {
    if (c == '-') a = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    b = (b << 3) + (b << 1) + c - '0';
    c = getchar();
  }
  return a * b;
}
inline void print(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) print(x / 10);
  putchar(x % 10 + '0');
}
struct edge {
  int next, to;
} e[N * 10];
int cnt, last[N], tim, E;
void add(int a, int b) {
  cnt++;
  e[cnt].to = b, e[cnt].next = last[a], last[a] = cnt;
}
bool find(int x) {
  for (int i = last[x]; i; i = e[i].next) {
    if (v[e[i].to] == tim) continue;
    v[e[i].to] = tim;
    if (!F[e[i].to] || find(F[e[i].to])) {
      F[e[i].to] = x;
      return 1;
    }
  }
  return 0;
}
int lastlast = 0;
int check(int mid) {
  int ans = 0;
  if (mid < lastlast) {
    memset(last, 0, sizeof(last));
    memset(F, 0, sizeof(F));
    memset(v, 0, sizeof(v));
    lastlast = 0;
    memset(temp, 0, sizeof(temp));
    cnt = tim = 0;
  }
  for (int i = lastlast + 1; i <= mid; ++i) {
    add(aa[i].a, aa[i].b);
  }
  lastlast = mid;
  for (int i = 1; i <= n; ++i) {
    if (temp[i]) {
      ans++;
      continue;
    }
    tim++;
    int tmp = find(i);
    ans += tmp;
    temp[i] = tmp;
  }
  if (ans == n) return 1;
  return 0;
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= m; ++i) {
    int a, b, c;
    a = read(), b = read(), c = read();
    aa[i].a = a, aa[i].b = b, aa[i].c = c;
  }
  std::sort(aa + 1, aa + 1 + m);
  int l = m, r = 0, ans = 0;
  while (l - 1 > r) {
    int mid = l + r >> 1;
    if (check(mid)) {
      l = mid;
      ans = 1;
    } else
      r = mid;
  }
  if (ans)
    print(aa[l].c);
  else
    puts("-1");
  return 0;
}
