#include <bits/stdc++.h>

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,m;
    cin>>n>>m;
    vector<pair<int,int> > edges(m);
    vector<vector<int>> perm;
    vector<vector<int>> perm_o;
    vector<int> perm_s;
    for(int i = 0 ; i < m ; i ++){
        cin>>edges[i].first;edges[i].first --;
        cin>>edges[i].second;edges[i].second --;
    }
    vector<vector<int> > counts(n, vector<int> (n));

    perm.push_back(vector<int> (n,-1));
    perm_o.push_back(vector<int> (n,-1));
    perm_s.push_back(0);
    bool goodall = false;
    int iter = 0;
    while(perm.size() <= 50000 && !goodall){
        iter ++;
        for(int e = 0 ; e < m && perm.size() <= 50000; e ++){
            bool f = false;
            int estr = edges[e].first;
            int eend = edges[e].second;
            if(counts[estr][eend]*2 <= perm.size())
                for(int g = 0 ; g < perm.size() ; g ++){
                    if(perm_o[g][estr] == -1 && perm_o[g][eend] == -1){
                        perm_o[g][estr] = perm_s[g]; perm[g][perm_s[g]] = estr;  perm_s[g]++;
                        perm_o[g][eend] = perm_s[g]; perm[g][perm_s[g]] = eend;  perm_s[g]++;
                        counts[estr][eend] ++;
                        for(int p = 0 ; p < perm_s[g] -2 ; p ++){
                            counts[perm[g][p]][estr] ++;
                            counts[perm[g][p]][eend] ++;
                        }
                        f = true;
                        break;
                    }else if(perm_o[g][eend] == -1){
                        perm_o[g][eend] = perm_s[g]; perm[g][perm_s[g]] = eend;  perm_s[g]++;
                        for(int p = 0 ; p < perm_s[g] -1 ; p ++){
                            counts[perm[g][p]][eend] ++;
                        }
                        f = true;
                        break;
                    }else{
                        continue;
                    }
                }
            if(!f && counts[estr][eend]*2 <= perm.size()){
                perm.push_back(vector<int> (n,-1));
                perm_o.push_back(vector<int> (n,-1));
                perm_s.push_back(2);

                counts[estr][eend] ++;
                int g = perm.size() -1;
                perm[g][0] = estr;
                perm[g][1] = eend;
                perm_o[g][estr] = 0;
                perm_o[g][eend] = 1;
            }
        }
        goodall = true;
        for(int e = 0 ; e < m ; e ++) {
            int estr = edges[e].first;
            int eend = edges[e].second;
            if(counts[estr][eend]*2 <= perm.size()){
                goodall = false;
                break;
            }
        }
    }
    if(!goodall){
        cout << "NO";
    }else{
        cout <<"YES\n";
        cout << perm.size() << endl;
        for(int g = 0 ; g < perm.size() ; g ++){
            for(int p = 0 ; p < perm_s[g] ; p ++){
                cout << perm[g][p]+1 <<" ";
            }
            for(int v = 0 ; v < n ; v ++){
                if(perm_o[g][v] == -1)
                    cout << v+1 <<" ";
            }
            cout << endl;
        }
    }
}