Rt,qaq
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<complex>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int inf=1<<30;
int n,m,s=1008,t=1009;
int ans[1050];
struct point{
int v,next,val;
}a[5001];
int top=1,head[5001];
inline void add(int u,int v,int w){
a[++top].v=v;
a[top].val=w;
a[top].next=head[u];
head[u]=top;
}
int book[1001];
struct Pre{
int v,edge;
}b[5001];
inline bool bfs(){
queue<int> q;
memset(book,0,sizeof(book));
memset(b,-1,sizeof(b));
book[s]=1;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=a[i].next){
int x=a[i].v;
if(!book[x]&&a[i].val){
b[x].v=u;
b[x].edge=i;
if(x==t)
return 1;
book[x]=1;
q.push(x);
}
}
}
return 0;
}
int EK(){
int s1=0;
while(bfs()){
int minn=inf;
for(int i=t;i!=s;i=b[i].v)
minn=min(minn,a[b[i].edge].val);
for(int i=t;i!=s;i=b[i].v){
ans[b[i].v]=i;
a[b[i].edge].val-=minn;
a[b[i].edge^1].val+=minn;
}
s1+=minn;
}
return s1;
}
int main()
{
m=read(),n=read();
for(int i=1;i<=n;i++)
add(i+n,t,1),add(t,i+n,0);
for(int i=1;i<=m;i++)
add(s,i,1),add(i,s,0);
while(1){
int u,v;
u=read(),v=read();
if(u==-1&&v==-1)
break;
add(u,v+n,1);
add(v+n,u,0);
}
cout<<EK()<<endl;
for(int i=1;i<=n;i++)
if(ans[i]!=0)
cout<<i<<' '<<ans[i]-n<<endl;
return 0;
}