#include #include using namespace std; #define NNODE_MAX 200 #define NIL (-1) int nnode, nedge; vector G[NNODE_MAX+1]; int parent[NNODE_MAX+1]; bool visited[NNODE_MAX+1]; void dfs( int n ) { visited[n] = true; for ( int i = 0; i < G[n].size(); i++ ) if ( !visited[G[n][i]] ) dfs(G[n][i]); } void printCycle( int p, int q ) { vector P, Q; for ( int n = p; n != NIL; n = parent[n] ) P.push_back(n); for ( int n = q; n != NIL; n = parent[n] ) Q.push_back(n); int pw = P.size() - 1, qw = Q.size() - 1; while ( pw >= 0 && qw >= 0 && P[pw] == Q[qw] ) pw--, qw--; cout << pw+1 + qw+1 + 1; for ( int i = 0; i <= pw; i++ ) cout << ' ' << P[i]; cout << ' ' << P[pw+1]; for ( int i = qw; i >= 0; i-- ) cout << ' ' << Q[i]; cout << endl; } void dfs( int n, int p ) { visited[n] = true; parent[n] = p; for ( int i = 0; i < G[n].size(); i++ ) { if ( G[n][i] == p ) continue; if ( !visited[G[n][i]] ) dfs(G[n][i], n); else if ( n < G[n][i] ) printCycle(n, G[n][i]); } } void compute() { for ( int n = 1; n <= nnode; n++ ) visited[n] = false; int ncomponent = 0; for ( int n = 1; n <= nnode; n++ ) if ( !visited[n] ) dfs(n), ncomponent++; cout << nedge - nnode + ncomponent << endl; for ( int n = 1; n <= nnode; n++ ) visited[n] = false; for ( int n = 1; n <= nnode; n++ ) if ( !visited[n] ) dfs(n, NIL); } int main() { cin >> nnode >> nedge; int left, right; for ( int i = 0; i < nedge; i++ ) { cin >> left >> right; G[left].push_back(right); G[right].push_back(left); } compute(); return 0; }