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