#include<bits/stdc++.h>
using namespace std;
int n,m;
struct oppo {
int to,nex,s;
} rod[100005];
int head[205],tot=1,h[100005];
void add(int from,int to,int s) {
rod[++tot].to=to;
rod[tot].nex=head[from];
rod[tot].s=s;
head[from]=tot;
}
int d[205];
queue< int > v;
bool bfs() {
memset(d,-1,sizeof(d));
v.push(0);
d[0]=1;
while(v.size()) {
int lxl=v.front();
v.pop();
for(int i=head[lxl]; i; i=rod[i].nex) {
int to=rod[i].to;
if(rod[i].s&&d[to]==-1) {
d[to]=d[lxl]+1;
v.push(to);
}
}
}
return d[n+m+1]!=-1;
}
int find(int x,int lowt) {
if(x==n+m+1) return lowt;
int low=0;
for(int i=head[x]; i && low<lowt; i=rod[i].nex) {
int to=rod[i].to;
if(rod[i].s&&d[to]==d[x]+1) {
int k=find(to,min(lowt-low,rod[i].s));
low+=k;
rod[i].s-=k;
rod[i^1].s+=k;
}
}
return low;
}
int dinic() {
int ans=0,t;
while(bfs())
while(t=find(0,100))
ans+=t;
return ans;
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) {
add(0,i,1);
add(i,0,0);
}
for(int i=n+1; i<=n+m; i++) {
add(i,n+m+1,1);
add(n+m+1,i,0);
}
while(1) {
int x,y;
scanf("%d%d",&x,&y);
if(x==-1&&y==-1) break;
add(x,y,1);
h[tot]=x;
add(y,x,0);
}
cout<<dinic()<<endl;
for(int i=2*n+2*m+2; i<=tot; i+=2)
if(!rod[i].s)
cout<<h[i]<<" "<<rod[i].to<<"\n";
return 0;
}