#include <fstream>
#define nmax 1501
using namespace std;
struct nod_lista{
int vecin;
nod_lista *link;
};
nod_lista *G[nmax],*Last[nmax];
int Viz[nmax],T[nmax],CC[nmax][nmax],Lev[nmax];
int N,M,nr_cicluri;
void adauga(int unde,int ce)
{
nod_lista *q=new nod_lista;
q->vecin=ce;
q->link=NULL;
if(!G[unde])
G[unde]=Last[unde]=q;
else
{
Last[unde]->link=q;
Last[unde]=q;
}
}
void citeste()
{
ifstream f("police.in");
int i,x,y;
f>>N>>M;
for(i=1;i<=M;i++)
{
f>>x>>y;
adauga(x,y);
adauga(y,x);
}
f.close();
}
void ciclu_nou(int nod,int rad)
{
++nr_cicluri;
while(nod!=rad)
{
++CC[nr_cicluri][0];
CC[nr_cicluri][CC[nr_cicluri][0]]=nod;
nod=T[nod];
}
++CC[nr_cicluri][0];
CC[nr_cicluri][CC[nr_cicluri][0]]=nod;
}
void DFS(int nod)
{
nod_lista *q=G[nod];
while(q)
{
if(!Viz[q->vecin])
{
T[q->vecin]=nod;
Viz[q->vecin]=1;
Lev[q->vecin]=Lev[nod]+1;
DFS(q->vecin);
}
else
if((q->vecin!=T[nod])&&(Lev[nod]>Lev[q->vecin]))
ciclu_nou(nod,q->vecin);
q=q->link;
}
}
void rezolva()
{
int i;
for(i=1;i<=N;i++)
if(!Viz[i])
{
Viz[i]=1;
Lev[i]=1;
DFS(i);
}
}
void scrie()
{
ofstream g("police.out");
int i,j;
g<<nr_cicluri<<'\n';
for(i=1;i<=nr_cicluri;i++)
{
g<<CC[i][CC[i][0]]<<' ';
for(j=1;j<=CC[i][0];j++)
g<<CC[i][j]<<' ';
g<<'\n';
}
g.close();
}
int main()
{
citeste();
rezolva();
scrie();
return 0;
}
I2luY2x1ZGUgPGZzdHJlYW0+CiNkZWZpbmUgbm1heCAxNTAxCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgbm9kX2xpc3RhewogICAgaW50IHZlY2luOwogICAgbm9kX2xpc3RhICpsaW5rOwp9OwoKbm9kX2xpc3RhICpHW25tYXhdLCpMYXN0W25tYXhdOwppbnQgVml6W25tYXhdLFRbbm1heF0sQ0Nbbm1heF1bbm1heF0sTGV2W25tYXhdOwppbnQgTixNLG5yX2NpY2x1cmk7Cgp2b2lkIGFkYXVnYShpbnQgdW5kZSxpbnQgY2UpCnsKICAgIG5vZF9saXN0YSAqcT1uZXcgbm9kX2xpc3RhOwoKICAgIHEtPnZlY2luPWNlOwogICAgcS0+bGluaz1OVUxMOwogICAgaWYoIUdbdW5kZV0pCiAgICBHW3VuZGVdPUxhc3RbdW5kZV09cTsKICAgIGVsc2UKICAgIHsKICAgICAgICBMYXN0W3VuZGVdLT5saW5rPXE7CiAgICAgICAgTGFzdFt1bmRlXT1xOwogICAgfQp9Cgp2b2lkIGNpdGVzdGUoKQp7CiAgICBpZnN0cmVhbSBmKCJwb2xpY2UuaW4iKTsKICAgIGludCBpLHgseTsKCiAgICBmPj5OPj5NOwogICAgZm9yKGk9MTtpPD1NO2krKykKICAgIHsKICAgICAgICBmPj54Pj55OwogICAgICAgIGFkYXVnYSh4LHkpOwogICAgICAgIGFkYXVnYSh5LHgpOwogICAgfQoKICAgIGYuY2xvc2UoKTsKfQoKdm9pZCBjaWNsdV9ub3UoaW50IG5vZCxpbnQgcmFkKQp7CiAgICArK25yX2NpY2x1cmk7CiAgICB3aGlsZShub2QhPXJhZCkKICAgIHsKICAgICAgICArK0NDW25yX2NpY2x1cmldWzBdOwogICAgICAgIENDW25yX2NpY2x1cmldW0NDW25yX2NpY2x1cmldWzBdXT1ub2Q7CiAgICAgICAgbm9kPVRbbm9kXTsKICAgIH0KICAgICsrQ0NbbnJfY2ljbHVyaV1bMF07CiAgICBDQ1tucl9jaWNsdXJpXVtDQ1tucl9jaWNsdXJpXVswXV09bm9kOwp9Cgp2b2lkIERGUyhpbnQgbm9kKQp7CiAgICBub2RfbGlzdGEgKnE9R1tub2RdOwogICAgd2hpbGUocSkKICAgIHsKICAgICAgICBpZighVml6W3EtPnZlY2luXSkKICAgICAgICB7CiAgICAgICAgICAgIFRbcS0+dmVjaW5dPW5vZDsKICAgICAgICAgICAgVml6W3EtPnZlY2luXT0xOwogICAgICAgICAgICBMZXZbcS0+dmVjaW5dPUxldltub2RdKzE7CiAgICAgICAgICAgIERGUyhxLT52ZWNpbik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICBpZigocS0+dmVjaW4hPVRbbm9kXSkmJihMZXZbbm9kXT5MZXZbcS0+dmVjaW5dKSkKICAgICAgICBjaWNsdV9ub3Uobm9kLHEtPnZlY2luKTsKCiAgICAgICAgcT1xLT5saW5rOwogICAgfQp9Cgp2b2lkIHJlem9sdmEoKQp7CiAgICBpbnQgaTsKICAgIGZvcihpPTE7aTw9TjtpKyspCiAgICBpZighVml6W2ldKQogICAgewogICAgICAgIFZpeltpXT0xOwogICAgICAgIExldltpXT0xOwogICAgICAgIERGUyhpKTsKICAgIH0KfQoKdm9pZCBzY3JpZSgpCnsKICAgIG9mc3RyZWFtIGcoInBvbGljZS5vdXQiKTsKICAgIGludCBpLGo7CgogICAgZzw8bnJfY2ljbHVyaTw8J1xuJzsKCiAgICBmb3IoaT0xO2k8PW5yX2NpY2x1cmk7aSsrKQogICAgewogICAgICAgIGc8PENDW2ldW0NDW2ldWzBdXTw8JyAnOwogICAgICAgIGZvcihqPTE7ajw9Q0NbaV1bMF07aisrKQogICAgICAgIGc8PENDW2ldW2pdPDwnICc7CgogICAgICAgIGc8PCdcbic7CiAgICB9CgogICAgZy5jbG9zZSgpOwp9CgoKaW50IG1haW4oKQp7CiAgICBjaXRlc3RlKCk7CiAgICByZXpvbHZhKCk7CiAgICBzY3JpZSgpOwogICAgcmV0dXJuIDA7Cn0K