#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
using namespace std;
int N;
int List[1005]={0};
int father[1005];
void init()
{
for(int i=1;i<=N;i++)
father[i]=i;
}
int findroot(int x)//查
{
int p1=x;
while(father[x]!=x)
x=father[x];
//x是根了
//路径压缩
while(father[p1]!=x)
{
int p2=p1;
p1=father[p2];
father[p2]=x;
}
return x;
}
void Union(int t1,int t2)//并
{
int r1=findroot(t1);
int r2=findroot(t2);
if(r1!=r2)
father[r1]=r2;
}
int book[1005]={0};
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&N);
init();
for(int i=1;i<=N;i++)
{
int k;
scanf("%d:",&k);
while(k--)
{
int t;
scanf("%d",&t);
if(List[t]==0)
List[t]=i;
else
Union(List[t],i);
}
}
for(int i=1;i<=N;i++)
{
int root=findroot(i);
book[root]++;
}
vector<int> v;
for(int i=1;i<=N;i++)
{
if(book[i]!=0)
v.push_back(book[i]);
}
sort(v.begin(),v.end(),cmp);
printf("%d\n",v.size());
for(int i=0;i<v.size();i++)
{
printf("%d",v[i]);
if(i!=v.size()-1)
printf(" ");
}
return 0;
}