#include <bits/stdc++.h> using namespace std; int const mxn = 100; vector<int> g[mxn]; mt19937 _rand(time(NULL)); int cnt[51][51]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; for(int i = 0; i < m; i ++){ int u, v; cin >> u >> v; -- u; -- v; g[u].push_back(v); } vector<int> v; for(int i = 0; i < n; i ++){ v.push_back(i); } bool ok = true; int pos[n]; int K = 0; vector<vector<int> > sol; while(ok && K < 50000){ ++K; shuffle(v.begin(), v.end(), _rand); for(int i = 0; i < n; i ++){ pos[v[i]] = i; } int cnt1 = 0; int cnt2 = 0; for(int i = 0; i < n; i ++){ for(auto u : g[i]){ if(pos[i] < pos[u]) cnt1 ++; else cnt2 ++; } } if(cnt1 < cnt2){ reverse(v.begin(), v.end()); } for(int i = 0; i < n; i ++) pos[v[i]] = i; ok = false; for(int i = 0; i < n; i ++){ for(auto u : g[i]){ if(pos[i] < pos[u]) cnt[i][u] ++; if(cnt[i][u] <= K / 2){ ok = true; } } } sol.push_back(v); } ok = true; for(int i = 0; i < n; i ++) { for (auto u: g[i]) { if (cnt[i][u] <= K / 2) { ok = false; } } } if(!ok){ cout << "NO"<<endl; } else{ cout << "YES"<<endl; cout << K << endl; for(auto v : sol){ for(auto u : v) { cout << u + 1 << ' '; } cout << endl; } cout << endl; } return 0; }