Link 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;
}