- 有向无环图的最小路径点覆盖——网络流方法+方案构造
#include <bits/stdc++.h>
using namespace std;
int to[20005],e[20005],nx[20005],h[305],cur[305],r[155],tot;
bool v[155];
void add(int u,int v,int w)
{tot++;to[tot]=v;e[tot]=w;nx[tot]=h[u];h[u]=tot;
}
int s,t,flow;
int d[305],n,m;
bool bfs()
{queue<int>q;memset(d,0,sizeof(int)*(t-s+1));q.push(s);d[s]=1;while(q.size()){int n1=q.front();q.pop();cur[n1]=h[n1];for(int i=h[n1];i;i=nx[i]){int y=to[i];if(!d[y]&&e[i]){d[y]=d[n1]+1;q.push(y);}}}return d[t];
}
int dinic(int n1,int flow)
{if(n1==t){return flow;}int rest=flow;for(int i=cur[n1];i&&rest;i=nx[i]){cur[n1]=i;int y=to[i];if(e[i]&&d[y]==d[n1]+1){int k=dinic(y,min(rest,e[i]));if(k==0){d[y]=0;}rest-=k;e[i]-=k;e[i^1]+=k;}}return flow-rest;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cin>>n>>m;tot=1;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v+n,1);add(v+n,u,0);}s=0,t=2*n+1;for(int i=1;i<=n;i++){add(s,i,1);add(i,s,0);add(i+n,t,1);add(t,i+n,0);}while(bfs()){flow+=dinic(s,INT_MAX);}for(int i=n+1;i<=2*n;i++){for(int j=h[i];j;j=nx[j]){if(to[j]>=1&&to[j]<=n&&e[j]){r[to[j]]=i-n;v[i-n]=true;}}}for(int i=1;i<=n;i++){if(v[i]==false){int p=i;while(p){cout<<p<<" ";p=r[p];}cout<<endl;}}cout<<n-flow<<endl;return 0;
}