并查集
//
// main.cpp
// PATA1107
//
// Created by Phoenix on 2018/2/23.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int father[maxn];
bool flag[maxn] = {false};
int num[maxn] = {0};
int findFather(int x) {
int a = x;
while(a != father[a]) {
a = father[a];
}
while (x != father[x]) {
int c = father[x];
father[x] = a;
x = c;
}
return a;
}
void Union(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB) father[faB] = faA;
}
bool cmp(int a, int b) {
return a > b;
}
int main(int argc, const char * argv[]) {
for(int i = 0; i < maxn; i++) {
father[i] = i;
}
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
int k, a;
scanf("%d: %d", &k, &a);
flag[a] = true;
num[a]++;
for(int j = 1; j < k; j++) {
int b;
scanf("%d", &b);
flag[b] = true;
Union(a, b);
}
}
int k = 0;
for(int i = 0; i < maxn; i++) {
if(father[i] == i && flag[i] == true) k++;
}
printf("%d\n", k);
for(int i = 0; i < maxn; i++) {
if(num[i] && findFather(i) != i) {
num[findFather(i)] += num[i];
num[i] = 0;
}
}
sort(num, num + maxn, cmp);
for(int i = 0; i < k; i++) {
printf("%d", num[i]);
if(i < k - 1) printf(" ");
else printf("\n");
}
return 0;
}