func_code_string: #include <bits/stdc++.h>   using namespace std;   const int inf = 1e9 + 7;   struct Matching {     int n;     vector<int> matchL, matchR, dist;     vector<bool> seen;     vector<vector<int>> ke;     Matching(int n)         : n(n),           matchL(n + 1),           matchR(n + 1),           dist(n + 1),           seen(n + 1, false),           ke(n + 1) {}     void addEdge(int u, int v) { ke[u].push_back(v); }     bool bfs() {       queue<int> qu;       for (int u = 1; u <= n; ++u)         if (!matchL[u]) {           dist[u] = 0;           qu.push(u);         } else           dist[u] = inf;       dist[0] = inf;       while (!qu.empty()) {         int u = qu.front();         qu.pop();         for (__typeof(ke[u].begin()) v = ke[u].begin(); v != ke[u].end(); ++v) {           if (dist[matchR[*v]] == inf) {             dist[matchR[*v]] = dist[u] + 1;             qu.push(matchR[*v]);           }         }       }       return dist[0] != inf;     }     bool dfs(int u) {       if (u) {         for (__typeof(ke[u].begin()) v = ke[u].begin(); v != ke[u].end(); ++v)           if (dist[matchR[*v]] == dist[u] + 1 && dfs(matchR[*v])) {             matchL[u] = *v;             matchR[*v] = u;             return true;           }         dist[u] = inf;         return false;       }       return true;     }     int match() {       int res = 0;       while (bfs()) {         for (int u = 1; u <= n; ++u)           if (!matchL[u])             if (dfs(u)) ++res;       }       return res;     }   };   const int M = 1e5 + 5;   pair<int, pair<int, int>> edge[M];   int m, n;   bool check(int max_weight) {     Matching matching(n);     for (auto e : edge) {       if (e.first > max_weight) break;       matching.addEdge(e.second.first, e.second.second);     }     return matching.match() == n;   }   int solve() {     int edge_num_needed = m;     for (int shift = floor(log2(m)); shift >= 0; --shift) {       if ((1 << shift) > edge_num_needed) continue;       if (check(edge[edge_num_needed - (1 << shift) - 1].first)) {         edge_num_needed -= (1 << shift);       }     }     if (!check(edge[edge_num_needed - 1].first)) {       return -1;     }     return edge[edge_num_needed - 1].first;   }   int main() {     cin >> n >> m;     for (int i = 0; i < m; ++i) {       int u, v, d;       cin >> u >> v >> d;       edge[i] = {d, {u, v}};     }     sort(edge, edge + m);     cout << solve();   }   