#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
struct node{
int v,w,nxt,flw;
}e[N];
int tot,head[N];
int n,m,s,t;
int now[N],dep[N],vis[N],flg[501][501];
long long ans=0;
void init(){
for(int i = 0;i <= N-1;i++)head[i] = -1;
}
void add(int u,int v,int w){
e[tot].v = v;
e[tot].w = w;
e[tot].nxt = head[u];
e[tot].flw = 0;
head[u] = tot++;
e[tot].v = u;
e[tot].w = 0;
e[tot].nxt = head[v];
e[tot].flw = 0;
head[v] = tot++;
}
bool bfs(){
queue<int> q;
for(int i=0;i<=(n+m+1);i++)dep[i] = 0;
dep[s] = 1;
q.push(s);
while(q.size()){
int u = q.front();
q.pop();
for(int i = head[u];~i;i = e[i].nxt){
int v = e[i].v;
if((!dep[v]) && (e[i].w > e[i].flw)){
dep[v] = dep[u] + 1;
now[i]=head[i];
q.push(v);
}
}
}
return dep[t];
}
int dfs(int u,int flow){
if(u == t || (!flow))return flow;
int res = 0,d;
for(int i = now[u];~i;i = e[i].nxt){
now[u] = i;
int v = e[i].v;
if(dep[v] == dep[u] + 1 && e[i].w && (d = dfs(v,min(flow - res,e[i].w-e[i].flw)))){
if(d == 0) return 0;
res += d;
e[i].flw += d;
e[i^1].flw -= d;
if(res == flow)return flow;
}
}
return res;
}
void dinic(){
while(bfs()){
for(int i = 0;i < tot;i++){
now[i] = head[i];
}
ans += dfs(s,1e5);
}
return ;
}
void in(){
int e;
int x;
cin >> m >> x;
n = x - m;int u,v;
cin >> u >> v;
while(u!=-1&&v!=-1){
add(u,v,1);
add(v,u,1);
cin >> u >> v;
}
for(int i = 1;i <= m;i++){
add(0,i,1);
}
for(int i = m + 1;i <= m + n;i++){
add(i,n + m + 1,1);
}
s = 0;
t = n + m + 1;
return ;
}
void out(){
cout << ans << endl;
for(int i = 1;i < tot;i+=2){
if(e[i].v!=s&&e[i^1].v!=s)if(e[i].v!=t&&e[i^1].v!=t)if(e[i^1].flw!=0){
cout << e[i].v << ' ' << e[i^1].v << endl;
}
}
}
void work(){in();dinic();out();}
signed main(){init();work();}