CSES - Shared codeLink to this code: https://cses.fi/paste/06ebe5d8791ee34069da9d/
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
int par[501],graph[501][501],orig[501][501];
bool vis[501],vis2[501][501];
bool bfs(){
queue<int>que;
int u=1;
memset(vis,0,sizeof vis);
que.push(u);
while(!que.empty()){
u=que.front();
que.pop();
if(vis[u])continue;
vis[u]=true;
for(int v=2;v<=n;v++){
if(!vis[v] and graph[u][v]>0){
par[v]=u;
que.push(v);
}
}
}
return vis[n];
}
bool find(){
queue<int>que;
int u=1;
memset(vis,0,sizeof vis);
que.push(u);
while(!que.empty()){
u=que.front();
que.pop();
if(vis[u])continue;
vis[u]=true;
for(int v=2;v<=n;v++){
if(!vis[v] and !vis2[u][v] and graph[u][v]==0 and orig[u][v]){
par[v]=u;
que.push(v);
}
}
}
return vis[n];
}
int main(){
cin>>n>>m;
int a,b;
for(int i=0;i<m;i++){
cin>>a>>b;
graph[a][b]=1;
orig[a][b]=1;
}
int cnt=0;
while(bfs()){
a=n;
cnt++;
while(a!=1){
graph[par[a]][a]--;
graph[a][par[a]]++;
a=par[a];
}
}
cout<<cnt<<endl;
memset(vis,0,sizeof vis);
for(int i=1;i<=cnt;i++){
vector<int>ans;
find();
a=n;
while(a!=1){
ans.push_back(a);
vis2[par[a]][a]=true;
a=par[a];
}
ans.push_back(1);
reverse(ans.begin(),ans.end());
cout<<ans.size()<<endl;
for(int num:ans)cout<<num<<" ";
cout<<endl;
}
return 0;
}