#include <bits/stdc++.h>
using namespace std;
struct matching {
  int n, m;
  vector<int> pa;
  vector<int> pb;
  vector<vector<int>> g;
  vector<int> q;
  vector<int> was;
  vector<int> unmatched;
  matching(int n, int m) : n(n), m(m) {
    pa.resize(n, -1);
    pb.resize(m, -1);
    g.resize(n);
    q.resize(n);
    was.resize(n);
    unmatched.resize(n);
    iota(unmatched.begin(), unmatched.end(), 0);
  }
  void add(int u, int v) {
    assert(u >= 0 && u < n && v >= 0 && v < m);
    g[u].push_back(v);
  }
  bool bfs() {
    int beg = 0, end = 0;
    for (int i = 0; i < n; i++)
      if (pa[i] == -1) {
        q[end++] = i;
        was[i] = 1;
      } else
        was[i] = 0;
    bool found = false;
    while (beg < end) {
      int v = q[beg++];
      for (auto& u : g[v]) {
        if (pb[u] == -1) {
          found = true;
          continue;
        }
        if (was[pb[u]]) continue;
        was[pb[u]] = was[v] + 1;
        q[end++] = pb[u];
      }
    }
    return found;
  }
  bool dfs(int v, int w = 1) {
    for (auto& u : g[v]) {
      if (pb[u] == -1) {
        pb[u] = v;
        pa[v] = u;
        return true;
      }
    }
    for (auto& u : g[v]) {
      if (was[pb[u]] == w + 1) {
        was[pb[u]] = 0;
        if (dfs(pb[u], w + 1)) {
          pb[u] = v;
          pa[v] = u;
          return true;
        }
      }
    }
    return false;
  }
  int solve() {
    int res = 0;
    while (bfs()) {
      int add = 0;
      for (int i = 0; i < (int)unmatched.size(); i++)
        if (dfs(unmatched[i])) {
          swap(unmatched[i], unmatched.back());
          unmatched.pop_back();
          --i;
          ++add;
        }
      if (!add) break;
      res += add;
    }
    return res;
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<tuple<int, int, int>> edges;
  for (int i = 0; i < m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    --u;
    --v;
    edges.emplace_back(w, u, v);
  }
  sort(edges.begin(), edges.end());
  auto test = [&](int val) {
    matching mat(n, n);
    for (auto& x : edges) {
      if (get<0>(x) > val) break;
      mat.add(get<1>(x), get<2>(x));
    }
    return (mat.solve() == n);
  };
  int l = 0, r = m - 1;
  while (l <= r) {
    int mid = l + r >> 1;
    if (test(get<0>(edges[mid])))
      r = mid - 1;
    else
      l = mid + 1;
  }
  if (l == m)
    cout << "-1";
  else
    cout << get<0>(edges[l]);
}
