#include <fstream>
#include <vector>
using namespace std;
ifstream fin("biconex.in");
ofstream fout("biconex.out");
int n, m, timp;
vector<int> g[100001], st;
vector<vector<int>> comp;
int niv[100001], low[100001];
void dfs(int u, int tata) {
niv[u] = low[u] = ++timp;
st.push_back(u);
for (int v : g[u]) {
if (v == tata) continue;
if (niv[v]) {
low[u] = min(low[u], niv[v]);
} else {
dfs(v, u);
low[u] = min(low[u], low[v]);
if (low[v] >= niv[u]) {
vector<int> c;
int x;
do {
x = st.back();
st.pop_back();
c.push_back(x);
} while (x != v);
c.push_back(u);
comp.push_back(c);
}
}
}
}
int main() {
fin >> n >> m;
for (int i = 0; i < m; i++) {
int x, y;
fin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
for (int i = 1; i <= n; i++)
if (!niv[i]) dfs(i, 0);
fout << comp.size() << "\n";
for (auto& c : comp) {
for (int x : c) fout << x << " ";
fout << "\n";
}
return 0;
}