#include<cstdio>
#include<cstring>
struct edge
{
int v,nxt;
}g[100000];
int head[2000],tot;
bool vis[2000];
int matched[2000];
void add(int u,int v)
{
g[++tot].v=v;
g[tot].nxt=head[u];
head[u]=tot;
}
int n,m;
bool dfs(int x)
{
for(int i=head[x];i;i=g[i].nxt)
{
int v=g[i].v;
if(vis[v]) continue;
vis[v]=1;
if(!matched[v]||dfs(matched[v]))
{
matched[v]=x;
return 1;
}
}
return 0;
}
int match()
{
int cnt=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
cnt+=dfs(i);
}
return cnt;
}
int main()
{
int u,v;
scanf("%d%d",&n,&m);
while(scanf("%d%d",&u,&v)&&!(u==-1&&v==-1))
{
scanf("%d%d",&u,&v);
add(u,v);
}
printf("%d\n",match());
for(int i=n+1;i<=m;i++)
if(matched[i])
printf("%d %d\n",matched[i],i);
return 0;
}