#include <stdio.h>
#include <string.h>
struct Node
{
int parent;
int level;
int update;
int isYeZi;
} node[110];
int n, m;
int level[110];
bool judge()
{
int count = 0, i;
for(i = 1; i <= 100; i++)
if(node[i].update == 1)
count++;
if(count == n)
return true;
return false;
}
int main()
{
int i, j, p, k, tmp;
while(scanf("%d%d", &n, &m) != EOF)
{
for(i = 1; i <= 100; i++)
{
node[i].isYeZi = 1;
node[i].update = 0;
node[i].level = 0;
node[i].parent = 0;
}
memset(level, 0, sizeof(level));
for(i = 1; i <= m; i++)
{
scanf("%d%d", &p, &k);
for(j = 1; j <= k; j++)
{
scanf("%d", &tmp);
node[p].isYeZi = 0;
node[tmp].parent = p;
}
}
node[1].update = 1;
node[1].level = 1;
if(node[1].isYeZi == 1)
{
printf("%d\n", n);
}
else
{
while(!judge())
{
for(i = 1; i <= 100; i++)
{
if(node[i].update == 1)
{
for(j = 1; j <= 100; j++)
{
if(node[j].parent == i)//已经确定父节点所在的层次更新后,孩子结点所在的层次才要更新(输入数据的次序)
{
node[j].level = node[i].level + 1;
node[j].update = 1;
}
}
}
}
}
int max = -1;
for(i = 1; i <= 100; i++)
{
if(node[i].update == 1)
{
level[node[i].level] += node[i].isYeZi;
if(node[i].level > max)
max = node[i].level;
}
}
for(i = 1; i <= max; i++)
{
if(i != max)
printf("%d ", level[i]);
else
printf("%d\n", level[i]);
}
}
}
return 0;
}