RT,WA on #6 #7 #10 and #11
#include<bits/stdc++.h>
#define int long long
#define inf 0x7fffffff
#define PII pair<int,int>
#define fx first
#define fy second
#define mk_p make_pair
#define Set(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e5+5;
struct edge{
int nxt,to,val;
}e[maxn];
int n,m,s,t,cnt=1,head[maxn],dis[maxn],cur[maxn],ans;
inline int read(){
int ans=0,flag=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')flag=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*flag;
}
inline string reads(){
string ss;char ch = getchar();
while(ch=='\n'||ch=='\r'||ch==' ') ch=getchar();
while(ch!='\n'&&ch!='\r'){if(ch!=' ') ss+=ch;ch=getchar();if(ch==EOF) break;}
return ss;
}
inline void add(int u,int v,int w){
e[++cnt].nxt=head[u];
e[cnt].to=v,e[cnt].val=w;
head[u]=cnt;
}
bool bfs(){
memset(dis,0,(n+1)*sizeof(int));
queue<int>q;
q.push(s);
dis[s]=1,cur[s]=head[s];
while(q.size()){
int u=q.front();q.pop();
for(int i=cur[u];i;i=e[i].nxt){
int to=e[i].to;
if(e[i].val&&!dis[to]){
dis[to]=dis[u]+1;
cur[to]=head[to];
q.push(to);
if(to==t) return 1;
}
}
}
return 0;
}
int dinic(int u,int low){
if(u==t) return low;
int flow=0;
for(int i=cur[u];i&&low;i=e[i].nxt){
int to=e[i].to;
if(e[i].val&&dis[to]==dis[u]+1){
int res=dinic(to,min(low,e[i].val));
e[i].val-=res,e[i^1].val+=res;
low-=res,flow+=res;
}
}
if(!flow) dis[u]=0;
return flow;
}
signed main(){
m=read(),n=read();
s=n+1,t=n+2;
int u,v;
while(scanf("%lld%lld",&u,&v)&&u!=-1&&v!=-1) add(u,v,1e18),add(v,u,0);
for(int i=1;i<=m;i++) add(s,i,1),add(i,s,0);
for(int i=m+1;i<=n;i++) add(i,t,1),add(t,i,0);
while(bfs()) ans+=dinic(s,1e18);
if(!ans){
printf("No Solution!");
return 0;
}
printf("%lld\n",ans);
for(int i=2;i<=cnt;i+=2)
if(e[i].to!=s&&e[i^1].to!=s&&e[i].to!=t&&e[i^1].to!=t&&e[i^1].val)
printf("%lld %lld\n",e[i^1].to,e[i].to);
return 0;
}