#include <bits/stdc++.h>
#define FOR(i,start,end,jump) for(int i=(start),_end=(end);i<=_end;i+=(jump))
#define fi first
#define se second
#define ps(any) push_back(any)
using namespace std;

const int maxn = 2003;

int n, m, x, y, k;
vector<vector<int>> a;
bool visited[maxn], isused[maxn][maxn];
vector<int> res[maxn], tam;

void READ(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>m;
    a.resize(n+1);
    FOR(i,1,m,1){
        cin>>x>>y;
        a[x].ps(y);
        a[y].ps(x);
    }
//    FOR(i,1,n,1) sort(a[i].begin(),a[i].end());
}

bool dfs(int v,int p)
{
    visited[v] = true;
    tam.ps(v);
    for(int j:a[v]){
        if(j != p){
            if(!visited[j]){
                dfs(j,v);
            }
            else{
                int cnt = 0;
                if(!isused[v][j]){
                    cnt++;
                    isused[v][j] = isused[j][v] = true;
                }
                int temp = tam.back();
                for(int t = tam.size()-2;t>=0;t--){
                    if(!isused[temp][tam[t]]) cnt++;
                    isused[temp][tam[t]] = isused[tam[t]][temp] = true;
                    temp = tam[t];
                }
                if(cnt>0)
                {
                    k++;
                    res[k].ps(j);
                    for(int t=tam.size()-1;t>=0 && tam[t]!=j; t--) res[k].ps(tam[t]);
                    res[k].ps(j);
                }
            }
        }
    }
    visited[v] = false;
    tam.pop_back();
}
void DO(){
    FOR(i,1,n,1){
        dfs(i,0);
    }
    cout<<k<<'\n';
    FOR(i,1,k,1){
        for(int j = res[i].size()-1;j>=0;j--) cout<<res[i][j]<<" ";
        cout<<'\n';
    }
}

int main()
{
    READ();
    DO();
}
