#include <iostream>//二分图匈牙利算法解法
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010,M=10010;
int h[N], e[M], ne[M], idx;
int n,m;
int st[N],match[N];
void add(int a, int b) // 添加一条边a->b
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
bool dfs(int s) {
for(int i=h[s];~i;i=ne[i]) {
int tt=e[i];
if(st[tt]==0) {
st[tt]=1;
if(match[tt]==-1||dfs(match[tt])) {
match[tt]=s;
return true;
}
}
}
return false;
}
int main()
{
cin>>n>>m;
int a,b;
memset(h, -1, sizeof h);
memset(match,-1,sizeof match);
while(cin>>a>>b) {
if(a==-1&&b==-1) break;
add(a, b);
}
int ans=0;
for(int i=1;i<=n;i++)
if(dfs(i)) {
memset(st, 0, sizeof st);
ans+=1;
}
cout<<ans<<endl;
for(int i=n+1;i<=n+m;i++)
if(match[i]!=-1)
cout<<match[i]<<' '<<i<<endl;
return 0;
}
#include <iostream>//二分图最大匹配最大流做法
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 10010,M=10010,inf=0x3f3f3f3f;
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], pre[N];
bool st[N];
int cnt[N];
int n,m,s,t;
int match[N];
void add(int a, int b, int c) // 添加一条边a->b,容量为c;同时添加一条反向边
{
e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++ ;
}
bool bfs() {
queue<int >q;
q.push(s);
memset(d,-1,sizeof d);
d[s]=0,cnt[s]=h[s];
while(q.size()) {
int g=q.front(); q.pop();
for(int i=h[g];~i;i=ne[i]) {
int tt=e[i];
if(d[tt]==-1&&f[i]) {
d[tt]=d[g]+1;
cnt[tt]=h[tt];
if(tt==t) return true;
q.push(tt);
}
}
}
return false;
}
int dfs(int ss,int limit) {
if(ss==t) return limit;
int flow=0;
for(int i=h[ss];~i&&flow<limit;i=ne[i]) {
int tt=e[i];
if(d[tt]==d[ss]+1&&f[i]) {
int ttt=dfs(tt,min(f[i],limit-flow));
if(ttt==0) d[tt]=-1;
else {
f[i]-=ttt,f[i^1]+=ttt,flow+=ttt;
match[tt]=ss;
}
}
}
return flow;
}
int dinic() {
int ans=0,flow;
while(bfs())
while(flow=dfs(s,inf)) ans+=flow;
return ans;
}
int main()
{
cin>>n>>m;
int a,b;
memset(h, -1, sizeof h);
memset(match,-1,sizeof match);
while(cin>>a>>b) {
if(a==-1&&b==-1) break;
add(a,b,1);
}
for(int i=1;i<=n;i++) add(0,i,1);
for(int i=n+1;i<=n+m;i++) add(i,n+m+1,1);
s=0,t=n+m+1;
int ans=dinic();
cout<<ans<<endl;
for(int i=n+1;i<=n+m;i++) if(match[i]!=-1) cout<<match[i]<<' '<<i<<endl;
return 0;
}