记录
#include<bits/stdc++.h>
using namespace std;
int cnt=1,ans=0,n,m,a,b,s,t,head[205],d[205],now[205];
struct edge{
int u,v,next,w;
}e[20205];
void add(int u,int v,int w){
e[++cnt].v=v; e[cnt].u=u; e[cnt].w=w; e[cnt].next=head[u]; head[u]=cnt;
e[++cnt].v=u; e[cnt].u=v; e[cnt].w=0; e[cnt].next=head[v]; head[v]=cnt;
}
bool bfs(){
memset(d,0,sizeof(d));
memset(now,0,sizeof(now));
now[s]=head[s];
d[s]=1;
queue<int> q;
q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].next){
if(e[i].w>0&&!d[e[i].v]){
d[e[i].v]=d[x]+1;
now[e[i].v]=head[e[i].v];
q.push(e[i].v);
}
}
}
if(d[t]) return 1;
return 0;
}
int dfs(int x,int w){
if(x==t) return w;
int k,res=0;
for(int i=now[x];i;i=e[i].next){
now[x]=i;
if((d[e[i].v]==d[x]+1)&&(e[i].w>0)){
k=dfs(e[i].v,min(w,e[i].w));
if(!k) continue;
res+=k;
w-=k;
e[i].w-=k;
e[i^1].w+=k;
}
}
return res;
}
int main(){
scanf("%d%d",&m,&n);
s=n+1,t=n+2;
while(scanf("%d%d",&a,&b)&&(a!=-1&&b!=-1)) add(a,b,1);
for(int i=1;i<=m;i++) add(s,i,1);
for(int i=m+1;i<=n;i++) add(i,t,1);
if(bfs()) {ans+=dfs(s,0x3f3f3f);}
printf("%d\n",ans);
for(int i=2;i<=cnt;i+=2){
if((e[i].u!=s&&e[i].v!=s)&&(e[i].u!=t&&e[i].v!=t))
if(e[i].w==0) printf("%d %d\n",e[i].u,e[i].v);
}
return 0;
}