#include <bits/stdc++.h>
using namespace std;
struct Hp {
  const int oo = 1e9 + 7;
  int n;
  vector<int> mL, mR, d;
  vector<vector<int>> g;
  Hp(int n) : n(n), mL(n + 1), mR(n + 1), d(n + 1), g(n + 1) {}
  void edge(int u, int v) { g[u].push_back(v); }
  bool B() {
    queue<int> q;
    for (int u = 1; u <= n; u++)
      if (mL[u])
        d[u] = oo;
      else
        d[u] = 0, q.push(u);
    d[0] = oo;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (auto v : g[u]) {
        if (d[mR[v]] == oo) d[mR[v]] = d[u] + 1, q.push(mR[v]);
      }
    }
    return d[0] != oo;
  }
  bool D(int u) {
    if (!u) return 1;
    for (auto v : g[u])
      if (d[mR[v]] == d[u] + 1 && D(mR[v])) {
        mL[u] = v;
        mR[v] = u;
        return 1;
      }
    d[u] = oo;
    return false;
  }
  int A() {
    int r = 0;
    while (B())
      for (int u = 1; u <= n; u++)
        if (!mL[u] && D(u)) r++;
    return r;
  }
};
std::vector<pair<int, pair<int, int>>> edges;
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    scanf("%d %d %d", &u, &v, &w);
    edges.push_back(pair<int, pair<int, int>>(w, pair<int, int>(u, v)));
  }
  int l = 1, r = 1e9 + 7, ans = 1e9 + 7, mm = 1e9 + 7;
  while (l <= r) {
    int mid = (l + r) / 2;
    Hp bpm(n + 1);
    for (auto x : edges) {
      if (x.first <= mid) bpm.edge(x.second.first, x.second.second);
    }
    int matched = bpm.A();
    if (matched >= n)
      mm = matched, ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  if (mm != n)
    printf("-1\n");
  else
    printf("%d\n", ans);
}
