func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m, S, T, du[10010];   struct edge {     int u, v, cap, flow;     edge() {}     edge(int u, int v, int c, int f) : u(u), v(v), cap(c), flow(f) {}   };   vector<edge> edges;   vector<int> e[10010];   inline void add_edge(int u, int v, int c) {     edges.push_back(edge(u, v, c, 0));     edges.push_back(edge(v, u, 0, 0));     int m = edges.size();     e[u].push_back(m - 2);     e[v].push_back(m - 1);   }   int vis[10010], dis[10010], cur[10010];   bool bfs(int s, int t) {     memset(vis, 0, sizeof(vis));     queue<int> que;     que.push(s);     vis[s] = 1;     dis[s] = 0;     while (!que.empty()) {       int now = que.front();       que.pop();       for (int i = 0; i < (e[now].size()); i++) {         edge& nxt = edges[e[now][i]];         if (!vis[nxt.v] && nxt.cap > nxt.flow) {           vis[nxt.v] = 1;           dis[nxt.v] = dis[now] + 1;           que.push(nxt.v);         }       }     }     return vis[t];   }   int dfs(int st, int t, int low) {     if (st == t || low == 0) return low;     int flow = 0, f;     for (int& i = cur[st]; i < e[st].size(); i++) {       edge& nxt = edges[e[st][i]];       if (dis[nxt.v] == dis[st] + 1 &&           (f = dfs(nxt.v, t, min(low, nxt.cap - nxt.flow))) > 0) {         nxt.flow += f;         edges[e[st][i] ^ 1].flow -= f;         flow += f;         low -= f;         if (low == 0) break;       }     }     return flow;   }   int Dinic(int s, int t) {     int ans = 0;     while (bfs(s, t)) {       memset(cur, 0, sizeof(cur));       ans += dfs(s, t, 0x3f3f3f3f);     }     return ans;   }   pair<int, int> pp[10010];   bool check(int mid) {     edges.clear();     for (int i = 0; i <= n + m + 1; i++) e[i].clear();     for (int i = 1; i <= m; i++) {       add_edge(S, i, 1);       add_edge(i, m + pp[i].first, 1);       add_edge(i, m + pp[i].second, 1);     }     for (int i = 1; i <= n; i++) add_edge(m + i, T, min(du[i], mid));     int ans = Dinic(S, T);     if (ans < m) return false;     return true;   }   int main() {     scanf( %d %d , &n, &m);     S = 0, T = n + m + 1;     for (int i = 1; i <= m; i++) {       int u, v;       scanf( %d %d , &u, &v);       pp[i] = make_pair(u, v);       du[u]++;       du[v]++;     }     int L = 1, R = min(m, n - 1), ans = min(m, n - 1);     while (L <= R) {       int mid = (L + R) >> 1;       if (check(mid)) {         ans = mid;         R = mid - 1;       } else         L = mid + 1;     }     printf( %d n , ans);     check(ans);     int tmp = 0;     for (int i = 0; i < edges.size(); i += 2) {       if (edges[i].u <= m && edges[i].u >= 1 && edges[i].v >= m + 1 &&           edges[i].v <= n + m && edges[i].cap == edges[i].flow) {         int nxt = pp[edges[i].u].first;         if (nxt == edges[i].v - m) nxt = pp[edges[i].u].second;         printf( %d %d n , edges[i].v - m, nxt);       }     }   }   