#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int tree[1010], sum[1010];
vector<int> v[1010];
int cmp(int a, int b)
{
return a > b;
}
int findroot(int root)
{
if(tree[root] == -1)
{
return root;
}
else
{
tree[root] = findroot(tree[root]);
return tree[root];
}
}
int judge(int index[2])
{
int begin[2], size[2], i;
for(i = 0; i <= 1; i++)
{
size[i] = v[index[i]].size();
begin[i] = 0;
}
int j, h[2];
for(i = 0, j = 0; i < size[0] && j < size[1]; )
{
h[0] = v[index[0]][i];
h[1] = v[index[1]][j];
if(h[0] == h[1])
{
return 1;
}
else if(h[0] > h[1])
{
j++;
}
else
{
i++;
}
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
int i, j, k, hobby;
for(i = 1; i <= n; i++)
{
scanf("%d:", &k);
for(j = 1; j <= k; j++)
{
scanf("%d", &hobby);
v[i].push_back(hobby);
}
tree[i] = -1;
sum[i] = 1;
sort(v[i].begin(), v[i].end());
}
int index[2];
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(i == j)
{
continue;
}
index[0] = i;
index[1] = j;
if(judge(index) == 0)
{
continue;
}
index[0] = findroot(index[0]);
index[1] = findroot(index[1]);
if(index[0] == index[1])
{
continue;
}
if(sum[index[0]] >= sum[index[1]])
{
tree[index[1]] = index[0];
sum[index[0]] += sum[index[1]];
}
else
{
tree[index[0]] = index[1];
sum[index[1]] += sum[index[0]];
}
}
}
vector<int> res;
for(i = 1; i <= n; i++)
{
if(tree[i] == -1)
{
res.push_back(sum[i]);
}
}
sort(res.begin(), res.end(), cmp);
int size = res.size();
printf("%d\n", size);
for(i = 0; i < size; i++)
{
if(i > 0)
{
printf(" ");
}
printf("%d", res[i]);
}
printf("\n");
system("pause");
return 0;
}