#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
using ll = long long;
int n, m;
vector<int> edges[maxn];
struct DATA {
  int u, v;
  ll cost;
};
DATA p[maxn];
bool can(int mid) {
  vector<int> deg(n + n + 1);
  for (int i = 1; i <= n + n; ++i) {
    edges[i].clear();
  }
  set<pair<int, int>> ms;
  for (int i = 0; i <= mid; ++i) {
    ms.insert({p[i].u, p[i].v});
  }
  for (auto i : ms) {
    edges[i.first].push_back(i.second);
    ++deg[i.second];
  }
  bool good = 1;
  for (int i = 1; i <= n; ++i) {
    int cnt = 0;
    if (edges[i].empty()) good = 0;
    for (auto j : edges[i]) {
      if (deg[j] == 1) {
        ++cnt;
      }
    }
    if (cnt > 1) {
      good = 0;
    }
  }
  for (int i = n + 1; i <= n + n; ++i) {
    if (deg[i] == 0) {
      good = 0;
    }
  }
  return good;
}
int main(int argc, char const *argv[]) {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; ++i) {
    scanf("%d %d %lld", &p[i].u, &p[i].v, &p[i].cost);
    p[i].v += n;
  }
  sort(p, p + m, [&](DATA x, DATA y) { return x.cost < y.cost; });
  int lo = 0, hi = m - 1, ans = -1;
  while (lo <= hi) {
    int mid = (lo + hi) >> 1;
    if (can(mid)) {
      hi = mid - 1;
      ans = mid;
    } else {
      lo = mid + 1;
    }
  }
  if (ans == -1) {
    printf("-1\n");
  } else {
    printf("%lld\n", p[ans].cost);
  }
  return 0;
}
