RT
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int m,n,s,t;
int level[205];
int used[205];
int u,v,w;
struct Dinic{
int c;
int f;
}edge[205][205];
bool dinic_bfs(){
queue<int> q;
memset(level,0,sizeof(level));
q.push(1);
level[1]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int v=1;v<=n;v++){
if(!level[v] && edge[u][v].c>edge[u][v].f){
level[v]=level[u]+1;
q.push(v);
}
}
}
return level[n]!=0;
}
int dinic_dfs(int u,int cp){
int tmp=cp;
if(u==n)return cp;
for(int v=1;v<=n && tmp;v++){
if(level[u]+1==level[v]){
if(edge[u][v].c>edge[u][v].f){
int t=dinic_dfs(v,min(tmp,edge[u][v].c-edge[u][v].f));
edge[u][v].f+=t;
edge[v][u].f-=t;
tmp-=t;
}
}
}
return cp-tmp;
}
int dinic(){
int sum=0,tf=0;
while(dinic_bfs()){
while(tf=dinic_dfs(1,INF))sum+=tf;
}
return sum;
}
int main(){
cin>>n>>m;
int u,v;
cin>>u>>v;
for(int i=1;i<=n;i++){
edge[1][i+1].c++;
edge[i+1][1].c++;
}
for(int i=n+1;i<=m;i++){
edge[i+1][m+2].c++;
edge[m+2][i+1].c++;
}
n=m+2;
while(u!=-1 && v!=-1){
edge[u+1][v+1].c++;
edge[v+1][u+1].c++;
cin>>u>>v;
}
int ans=dinic();
printf("%d\n",ans);
for(int i=2;i<=n+1;i++){
for(int j=1;j<=m+1;j++){
if(edge[i][j].f && i<j && !used[i] && !used[j]){
used[i]=used[j]=true;
cout<<i-1<<' '<<j-1<<endl;
}
}
}
}