本地运行答案是对的
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=100010;
int n,m,s,t,dep[maxn],head[maxn],cnt=1;
struct E{
int to,next,w;
}edge[maxn];
void add(int u,int v,int w){
edge[++cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;
edge[cnt].w=w;
}
bool bfs(){
memset(dep,0,sizeof(dep));
queue<int>q;q.push(s);dep[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].next){
if(!dep[edge[i].to]&&edge[i].w){
dep[edge[i].to]=dep[u]+1;
q.push(edge[i].to);
}
}
}
return dep[t];
}
int dfs(int x,int dist){
if(x==t)return dist;
int flow=0;
for(int i=head[x];i&&dist;i=edge[i].next){
int y=edge[i].to;
if(dep[y]==dep[x]+1&&edge[i].w){
int res=dfs(y,min(dist,edge[i].w));
edge[i].w-=res;
edge[i^1].w+=res;
dist-=res;flow+=res;
}
}
if(!flow)dep[x]=-2;
return flow;
}
int dinic(){
int ans=0;
while(bfs())ans+=dfs(s,inf);
return ans;
}
int main(){
scanf("%d%d",&m,&n);s=0;t=n+1;
for(int x,y;x!=-1&&y!=-1;scanf("%d%d",&x,&y))add(x,y,inf),add(y,x,0);
for(int i=1;i<=m;i++)add(s,i,1),add(i,s,0);
for(int i=m+1;i<=n;i++)add(i,t,1),add(t,i,0);
printf("%d\n",dinic());
for(int i=2;i<=cnt;i+=2){
if(edge[i].to==s||edge[i^1].to==s)continue;
if(edge[i].to==t||edge[i^1].to==t)continue;
if(edge[i^1].w!=0){
printf("%d %d\n",edge[i^1].to,edge[i].to);
}
}
return 0;
}