#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int hf = 999983;
const int N = 1e6;
vector<pair<int, pair<int, int> > > v;
struct BipartiteMatching {
  vector<vector<int> > g;
  vector<int> L, R, vis;
  BipartiteMatching(int n, int m)
      : g(n + 1), L(n + 1, -1), R(m + 1, -1), vis(n + 1) {}
  void AddEdge(int a, int b) { g[a].emplace_back(b); }
  bool match(int u) {
    if (vis[u]) return false;
    vis[u] = 1;
    for (auto v : g[u]) {
      if (R[v] == -1) {
        L[u] = v;
        R[v] = u;
        return true;
      }
    }
    for (auto v : g[u]) {
      if (match(R[v])) {
        L[u] = v;
        R[v] = u;
        return true;
      }
    }
    return false;
  }
  int solve() {
    int ok = 1;
    while (ok--) {
      fill(vis.begin(), vis.end(), 0);
      int n = (int)L.size() - 1;
      for (int i = 1; i <= n; i++) {
        if (L[i] == -1) ok |= match(i);
      }
    }
    int res = 0;
    int n = (int)L.size() - 1;
    for (int i = 1; i <= n; i++) res += (L[i] != -1);
    return res;
  }
};
bool vis1[10005], vis2[10005];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    v.emplace_back(make_pair(c, make_pair(a, b)));
  }
  sort(v.begin(), v.end());
  int ans = -1;
  int lo = 0, hi = (int)v.size() - 1;
  while (lo <= hi) {
    int mid = (lo + hi) / 2;
    BipartiteMatching x(n + 1, n + 1);
    for (int i = 0; i <= mid; i++) {
      int c = v[i].first;
      int a = v[i].second.first, b = v[i].second.second;
      x.AddEdge(a, b);
    }
    if (x.solve() == n)
      ans = v[mid].first, hi = mid - 1;
    else
      lo = mid + 1;
  }
  printf("%d\n", ans);
}
