#include <bits/stdc++.h>   using namespace std;   long long MOD = 1000000007;   const long long INF = 1e12;   const long long N = 1e6 + 10;   vector<long long> G[100001];   long long n, m, match[100001], dist[100001];   bool bfs() {     long long i, u, v, len;     queue<long long> Q;     for (i = 1; i <= n; i++) {       if (match[i] == 0) {         dist[i] = 0;         Q.push(i);       } else         dist[i] = (1 << 28);     }     dist[0] = (1 << 28);     while (!Q.empty()) {       u = Q.front();       Q.pop();       if (u != 0) {         len = G[u].size();         for (i = 0; i < len; i++) {           v = G[u][i];           if (dist[match[v]] == (1 << 28)) {             dist[match[v]] = dist[u] + 1;             Q.push(match[v]);           }         }       }     }     return (dist[0] != (1 << 28));   }   bool dfs(long long u) {     long long i, v, len;     if (u != 0) {       len = G[u].size();       for (i = 0; i < len; i++) {         v = G[u][i];         if (dist[match[v]] == dist[u] + 1) {           if (dfs(match[v])) {             match[v] = u;             match[u] = v;             return true;           }         }       }       dist[u] = (1 << 28);       return false;     }     return true;   }   long long hopcroft_karp() {     long long matching = 0, i;     while (bfs())       for (i = 1; i <= n; i++)         if (match[i] == 0 && dfs(i)) matching++;     return matching;   }   vector<pair<long long, pair<long long, long long>>> edges;   long long check(long long x) {     for (long long i = 0; i <= 2 * n + 1; i++) {       G[i].clear();       match[i] = 0;       dist[i] = (1 << 28);     }     for (long long i = 0; i < (long long)edges.size() && edges[i].first <= x;          i++) {       long long u = edges[i].second.first, v = edges[i].second.second;       G[u].push_back(v);       G[v].push_back(u);     }     long long res = hopcroft_karp();     return n == res;   }   void solve() {     long long V;     cin >> n >> V;     m = n;     for (long long i = 0; i < V; i++) {       long long d, u, v;       cin >> u >> v >> d;       edges.push_back({d, {u, v + n}});     }     sort(edges.begin(), edges.end());     long long l = 1, h = 1e9 + 1;     long long ans = h;     while (l <= h) {       long long mid = (l + h) / 2;       if (check(mid)) {         h = mid - 1;         ans = mid;       } else {         l = mid + 1;       }     }     if (ans == 1e9 + 1)       cout << -1 <<   n ;     else       cout << ans;   }   signed main() {     ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);     long long t = 1;     while (t--) {       solve();     }   }   