func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename A, typename B>   inline void chmin(A &a, B b) {     if (a > b) a = b;   }   template <typename A, typename B>   inline void chmax(A &a, B b) {     if (a < b) a = b;   }   struct Dinic {     struct edge {       long long to, cap, rev;       edge(long long to, long long cap, long long rev)           : to(to), cap(cap), rev(rev) {}     };     const long long INF = 1001001001;     vector<vector<edge>> G;     vector<long long> level, iter;     Dinic(long long v) : G(v), level(v), iter(v) {}     void addEdge(long long from, long long to, long long cap) {       G[from].push_back(edge(to, cap, G[to].size()));       G[to].push_back(edge(from, 0, G[from].size() - 1));     }     void bfs(long long s) {       fill(level.begin(), level.end(), -1);       queue<long long> que;       level[s] = 0;       que.push(s);       while (que.size()) {         long long v = que.front();         que.pop();         for (auto &e : G[v]) {           if (e.cap && level[e.to] == -1) {             level[e.to] = level[v] + 1;             que.push(e.to);           }         }       }     }     long long dfs(long long v, long long t, long long f) {       if (v == t) return f;       for (long long &i = iter[v]; i < G[v].size(); i++) {         edge &e = G[v][i];         if (e.cap > 0 && level[v] < level[e.to]) {           long long d = dfs(e.to, t, min(f, e.cap));           if (d > 0) {             e.cap -= d;             G[e.to][e.rev].cap += d;             return d;           }         }       }       return 0;     }     long long maxFlow(long long s, long long t) {       long long flow = 0;       while (true) {         bfs(s);         if (level[t] < 0) return flow;         fill(iter.begin(), iter.end(), 0);         long long f;         while ((f = dfs(s, t, INF)) > 0) flow += f;       }     }   };   long long N, M;   long long A[5555], B[5555];   bool check(long long x) {     Dinic d(N + 2);     long long src = N;     long long snk = N + 1;     vector<long long> cnt(N);     for (long long i = 0; i < (M); i++) {       cnt[A[i]]++;       d.addEdge(A[i], B[i], 1);     }     long long f = 0;     for (long long i = 0; i < (N); i++) {       if (cnt[i] > x) {         d.addEdge(src, i, cnt[i] - x);         f += cnt[i] - x;       } else if (cnt[i] < x) {         d.addEdge(i, snk, x - cnt[i]);       }     }     if (d.maxFlow(src, snk) != f) return false;     set<pair<long long, long long>> es;     for (long long i = 0; i < (N); i++)       for (auto &e : d.G[i])         if (e.cap) es.insert({i, e.to});     for (long long i = 0; i < (M); i++) {       if (es.find({A[i], B[i]}) == es.end()) swap(A[i], B[i]);     }     return true;   }   signed main() {     cin >> N >> M;     for (long long i = 0; i < (M); i++) cin >> A[i] >> B[i], A[i]--, B[i]--;     long long lb = 0, ub = M;     while (ub - lb > 1) {       long long mid = (ub + lb) / 2;       if (check(mid))         ub = mid;       else         lb = mid;     }     check(ub);     cout << ub << endl;     for (long long i = 0; i < (M); i++)       cout << A[i] + 1 <<     << B[i] + 1 << endl;     return 0;   }   