Link to this code:
https://cses.fi/paste/f1bbb899670447c8db4bf7/#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
vector<int> parent;
ll f(vector<vector<ll>> &cap, int s, int t, vector<int> adj[]){
parent.assign(t+1, -1);
queue<pair<ll, ll>> q;
q.push({s, 1e9});
parent[s] = -2;
while(!q.empty()){
auto [node, flow] = q.front(); q.pop();
for(auto &child: adj[node]){
if(parent[child]==-1 and cap[node][child]>0){
parent[child] = node;
int nflow= min(flow, cap[node][child]);
if(child==t) return nflow;
q.push({child, nflow});
}
}
}
return 0;
}
int main(){
int n, m; cin>>n>>m;
vector<vector<ll>> cap(n+1, vector<ll>(n+1, 0));
vector<int> adj[n+1];
for(int i=0; i<m; i++){
ll u, v; cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
cap[u][v] += 1;
cap[v][u] += 1;
}
ll maxFlow = 0;
ll curr = 0;
parent.resize(n+1);
while(true){
curr = f(cap, 1, n, adj);
if(curr==0) break;
maxFlow+=curr;
int nd = n;
while(nd!=1){
cap[parent[nd]][nd] -= curr;
cap[nd][parent[nd]] += curr;
nd = parent[nd];
}
}
vector<bool> vis(n+1, false);
queue<int> q; q.push(1); vis[1] = true;
while(!q.empty()){
int node = q.front(); q.pop();
for(int i=1;i<=n;i++){
if(!vis[i] && cap[node][i]>0){
vis[i] = true;
q.push(i);
}
}
}
cout<<maxFlow<<endl;
for(int i=1;i<=n;i++){
if(!vis[i]) continue;
for(auto &child: adj[i]){
if(vis[child]) continue;
cout<<i<<" "<<child<<endl;
}
}
return 0;
}