func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m;   struct EDGE {     int u, v, w;   } p[100000 + 5];   struct Edge {     int v, w, next;   } edge[100000 + 5];   int head[100000 + 5], cnt = 0;   void init() {     cnt = 0;     memset(head, -1, sizeof head);   }   void add_edge(int u, int v, int w) {     edge[cnt].v = v;     edge[cnt].w = w;     edge[cnt].next = head[u];     head[u] = cnt++;   }   int vis[100000 + 5];   int rd[100000 + 5];   bool check(int up) {     memset(rd, 0, sizeof rd);     memset(vis, 0, sizeof vis);     queue<int> que;     for (int i = 1; i <= m; i++)       if (p[i].w > up) rd[p[i].v]++;     int tot = 0;     while (1) {       for (int u = 1; u <= n; u++)         if (!vis[u] && rd[u] == 0) que.push(u);       if (que.empty()) break;       while (!que.empty()) {         int u = que.front();         que.pop();         vis[u] = ++tot;         for (int i = head[u]; i != -1; i = edge[i].next)           if (!vis[edge[i].v] && edge[i].w > up) rd[edge[i].v]--;       }     }     for (int u = 1; u <= n; u++)       if (!vis[u]) return 0;     return 1;   }   int main() {     if (1 && fopen( in.txt ,  r )) {       freopen( in.txt ,  r , stdin);       freopen( out.txt ,  w , stdout);     }     init();     scanf( %d%d , &n, &m);     int l = 0, r = 0, mid;     for (int i = 1; i <= m; i++) {       scanf( %d%d%d , &p[i].u, &p[i].v, &p[i].w);       add_edge(p[i].u, p[i].v, p[i].w);       r = max(r, p[i].w);     }     while (l < r) {       mid = (l + r) >> 1;       if (check(mid))         r = mid;       else         l = mid + 1;     }     int ans = l;     vector<int> ansque;     check(ans);     for (int i = 1; i <= m; i++) {       int u = p[i].u, v = p[i].v;       if (p[i].w <= ans && vis[u] > vis[v]) ansque.push_back(i);     }     sort(ansque.begin(), ansque.end());     printf( %d %d n , ans, ansque.size());     for (int i = 0; i < ansque.size(); i++)       printf( %d%c , ansque[i], i == ansque.size() - 1 ?   n  :    );     return 0;   }   