#include <stdio.h>
#define MAX_SIZE 100
typedef struct{
int n,m;
int A[100][100];
}Graph;
void init_graph(Graph *G, int n){
G->n = n;
for(int u=1;u<=n;u++){
for(int v=1;v<=n;v++){
G->A[u][v] = 0;
}
}
G->m = 0;
}
void add_edge(Graph *G, int u, int v){
G->A[u][v]++;
G->A[v][u]++;
G->m++;
}
typedef struct{
int data[MAX_SIZE];
int front,rear;
}Queue;
void makenullQueue(Queue *Q){
Q->front = 0;
Q->rear = -1;
}
void enQueue(Queue *Q, int u){
Q->rear++;
Q->data[Q->rear] = u;
}
int front(Queue *Q){
return Q->data[Q->front];
}
void deQueue(Queue *Q){
Q->front++;
}
int empty(Queue *Q){
return Q->front > Q->rear;
}
int mark[100];
void BFS(Graph *G, int x){
Queue Q;
makenullQueue(&Q);
enQueue(&Q,x);
while(!empty(&Q)){
int u = front(&Q);
deQueue(&Q);
if(mark[u]!=0) continue;
mark[u] = 1;
for(int v=1;v<=G->n;v++){
if(G->A[u][v] > 0 && mark[v]==0){
enQueue(&Q,v);
}
}
}
}
int main(){
Graph G;
int n, m, u, v, e;
init_graph(&G, n);
for (e = 0; e < m; e++) {
add_edge(&G, u, v);
}
for(u=1;u<=G.n;u++){
mark[u] = 0;
}
for(u=1;u<=G.n;u++){
if(mark[u]==0)
BFS(&G,u);
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNkZWZpbmUgTUFYX1NJWkUgMTAwCnR5cGVkZWYgc3RydWN0ewogICAgaW50IG4sbTsKICAgIGludCBBWzEwMF1bMTAwXTsKfUdyYXBoOwp2b2lkIGluaXRfZ3JhcGgoR3JhcGggKkcsIGludCBuKXsKICAgIEctPm4gPSBuOwogICAgZm9yKGludCB1PTE7dTw9bjt1KyspewogICAgICAgIGZvcihpbnQgdj0xO3Y8PW47disrKXsKICAgICAgICAgICAgRy0+QVt1XVt2XSA9IDA7CiAgICAgICAgfQogICAgfQogICAgRy0+bSA9IDA7Cn0Kdm9pZCBhZGRfZWRnZShHcmFwaCAqRywgaW50IHUsIGludCB2KXsKICAgIEctPkFbdV1bdl0rKzsKICAgIEctPkFbdl1bdV0rKzsKICAgIEctPm0rKzsKfQp0eXBlZGVmIHN0cnVjdHsKCWludCBkYXRhW01BWF9TSVpFXTsKCWludCBmcm9udCxyZWFyOwp9UXVldWU7Cgp2b2lkIG1ha2VudWxsUXVldWUoUXVldWUgKlEpewoJUS0+ZnJvbnQgPSAwOwoJUS0+cmVhciA9IC0xOwp9Cgp2b2lkIGVuUXVldWUoUXVldWUgKlEsIGludCB1KXsKCVEtPnJlYXIrKzsKCVEtPmRhdGFbUS0+cmVhcl0gPSB1Owp9CgppbnQgZnJvbnQoUXVldWUgKlEpewoJcmV0dXJuIFEtPmRhdGFbUS0+ZnJvbnRdOwp9Cgp2b2lkIGRlUXVldWUoUXVldWUgKlEpewoJUS0+ZnJvbnQrKzsKfQoKaW50IGVtcHR5KFF1ZXVlICpRKXsKCXJldHVybiBRLT5mcm9udCA+IFEtPnJlYXI7Cn0KaW50IG1hcmtbMTAwXTsKdm9pZCBCRlMoR3JhcGggKkcsIGludCB4KXsKICAgIFF1ZXVlIFE7CiAgICBtYWtlbnVsbFF1ZXVlKCZRKTsKICAgIGVuUXVldWUoJlEseCk7CiAgICB3aGlsZSghZW1wdHkoJlEpKXsKICAgICAgICBpbnQgdSA9IGZyb250KCZRKTsKICAgICAgICBkZVF1ZXVlKCZRKTsKICAgICAgICBpZihtYXJrW3VdIT0wKSBjb250aW51ZTsKICAgICAgICBtYXJrW3VdID0gMTsKICAgICAgICBwcmludGYoIiVkXG4iLCB1KTsKICAgICAgICBmb3IoaW50IHY9MTt2PD1HLT5uO3YrKyl7CiAgICAgICAgICAgIGlmKEctPkFbdV1bdl0gPiAwICYmIG1hcmtbdl09PTApewogICAgICAgICAgICAgICAgZW5RdWV1ZSgmUSx2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQppbnQgbWFpbigpewogICAgR3JhcGggRzsKCWludCBuLCBtLCB1LCB2LCBlOwoJc2NhbmYoIiVkJWQiLCAmbiwgJm0pOwoJaW5pdF9ncmFwaCgmRywgbik7CgkKCWZvciAoZSA9IDA7IGUgPCBtOyBlKyspIHsKCQlzY2FuZigiJWQlZCIsICZ1LCAmdik7CgkJYWRkX2VkZ2UoJkcsIHUsIHYpOwoJfQoJZm9yKHU9MTt1PD1HLm47dSsrKXsKCQltYXJrW3VdID0gMDsKCX0KCWZvcih1PTE7dTw9Ry5uO3UrKyl7CgkJaWYobWFya1t1XT09MCkKCQlCRlMoJkcsdSk7Cgl9CiAgICAKfQ==