#include <bits/stdc++.h> using namespace std; const int maxn = 60; int n,m; vector<int> res[maxn]; vector<int> ciklus; bool bio[maxn]; bool bio2[maxn]; bool dfs(int node,vector<vector<int> > &g){ ciklus.push_back(node); if(bio2[node]) { return true; } if(bio[node]){ ciklus.pop_back(); return false; } bio2[node]=true; bio[node]=true; for(int i:g[node]){ if(dfs(i,g)) return true; } ciklus.pop_back(); return false; } vector<vector<int> > ubij(int a,int b,vector<vector<int> > g){ vector<vector<int> > ret(n+1); for(int i=1;i<=n;i++){ for(int j:g[i]){ if(i==a && j==b) continue; ret[i].push_back(j); } } return ret; } vector<int> kurac; bool bio3[maxn]; void dfs2(int node,vector<vector<int> > &g){ bio3[node]=true; for(int i:g[node]){ if(bio3[i]) continue; dfs2(i,g); } kurac.push_back(node); } vector<int> napravi(vector<vector<int> > g){ kurac.clear(); fill(bio3,bio3+n+1,false); for(int i=1;i<=n;i++){ if(bio3[i]) continue; dfs2(i,g); } reverse(kurac.begin(),kurac.end()); return kurac; } void uradi(int l,int r,vector<vector<int> > g){ fill(bio,bio+n+1,false); for(int i=1;i<=n;i++) { fill(bio2, bio2 + n + 1, false); if (!bio[i] && dfs(i, g)) { int poc = 0; for (int i = 0; i < ciklus.size(); i++) { if (ciklus[i] == ciklus.back()) { poc = i; break; } } int siz = ciklus.size() - poc - 1; siz = (r - l + 1) / siz; for (int i = poc; i + 1 < ciklus.size(); i++) { if (i + 2 < ciklus.size()) { uradi(l + (i - poc) * siz, l + (i - poc + 1) * siz - 1, ubij(ciklus[i], ciklus[i + 1], g)); } else { uradi(l + (i - poc) * siz, r, ubij(ciklus[i], ciklus[i + 1], g)); } } ciklus.clear(); return; } } vector<int> sta = napravi(g); for(int i=l;i<=r;i++) res[i]=sta; } int main() { cin>>n>>m; vector<vector<int> > g(n+1); for(int i=0;i<m;i++){ int a,b; cin>>a>>b; g[a].push_back(b); } uradi(0,n+5,g); cout<<"YES\n"; cout<<n+6<<"\n"; for(int i=0;i<n+6;i++){ for(int j:res[i]) cout<<j<<" "; cout<<"\n"; } return 0; }