数量就有错。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
}
const int N=2e4+5,M=3e5+5,inf=1e9;
int n,m,head[N],nxt[M],ver[M],edge[M],tot,e[M],s,t;
inline void add(int x,int y,int z){
ver[++tot]=y,edge[tot]=z,nxt[tot]=head[x],head[x]=tot;
ver[++tot]=x,edge[tot]=0,nxt[tot]=head[y],head[y]=tot;
}
int dep[N],now[N];
queue <int> q;
inline bool bfs(){
memset(dep,0,sizeof(dep));
while(q.size())q.pop();
q.push(s);dep[s]=1;now[s]=head[s];
while(q.size()){
int x=q.front();q.pop();
for(int i=now[x];i;i=nxt[i]){
int y=ver[i],z=edge[i];
if(z&&!dep[y]){
q.push(y);
dep[y]=dep[x]+1;
now[y]=head[y];
if(y==t)return true;
}
}
}
return false;
}
int dinic(int x,int flow){
if(x==t)return flow;
int i,k,rest=flow;
for(i=now[x];i&&rest;i=nxt[i]){
if(dep[ver[i]]==dep[x]+1&&edge[i]){
k=dinic(ver[i],min(flow,edge[i]));
if(!k)dep[ver[i]]=0;
edge[i]-=k,edge[i^1]+=k,rest-=k;
}
}
now[x]=i;
return flow-rest;
}
int hc[N],vc[M],nc[M],tc;
inline void add_c(int x,int y){vc[++tc]=y,nc[tc]=hc[x],hc[x]=tc;}
inline void addedge(){
for(int i=1;i<=m;i++){
if(!edge[e[i]])add_c(ver[e[i]],ver[e[i]^1]);
else add_c(ver[e[i]^1],ver[e[i]]);
}
for(int i=1;i<=n;i++){
if(!edge[4*i-2])add_c(i,s);else add_c(s,i);
if(!edge[4*i])add_c(t,i+n);else add_c(n+i,t);
}
}
int low[N],dfn[N],sta[N],c[N],num,top,cnt;
bool ins[N];
void tarjan(int x){
low[x]=dfn[x]=++num;
ins[x]=true,sta[++top]=x;
for(int i=hc[x];i;i=nc[i]){
if(!dfn[vc[i]]){
tarjan(vc[i]);
low[x]=min(low[x],low[vc[i]]);
}
else if(ins[vc[i]])low[x]=min(low[x],dfn[vc[i]]);
}
if(dfn[x]==low[x]){
int y;cnt++;
do{y=sta[top--],c[y]=cnt,ins[y]=false;}while(x!=y);
}
}
struct ANS{
int x,y;
bool operator <(const ANS X)const{
if(X.x==x)return y<X.y;
return x<X.x;
}
}ans[M];
int main(){
tot=1;
n=read(),m=read();
s=0,t=2*n+1;
for(int i=1;i<=n;i++)add(s,i,1),add(i+n,t,1);
for(int i=1;i<=m;i++){
int x=read(),y=read();
add(x,y+n,1),e[i]=tot;
}
while(bfs())while(dinic(s,inf));
addedge();
for(int i=s;i<=t;i++)
if(!dfn[i])tarjan(i);
int anscnt=0;
for(int i=1;i<=m;i++)
if(edge[e[i]]&&c[ver[e[i]]]!=c[ver[e[i]^1]])anscnt++,ans[anscnt].x=min(ver[e[i]],ver[e[i]^1]-n),ans[anscnt].y=(ver[e[i]],ver[e[i]^1]-n);
sort(ans+1,ans+anscnt+1);
printf("%d\n",anscnt);
for(int i=1;i<=anscnt;i++)
printf("%d %d\n",ans[i].x,ans[i].y);
return 0;
}