#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<unordered_map>
using namespace std;
/*
题意:找出每层的叶子节点
root为01
分析:建立树,然后深度搜索,如果没有孩子则相应的层树孩子加一
dfs(depth,indx)
leaf[]每层的叶子数
maxh最深的层数
最后输出
层序遍历需要考虑特例
1 0
每换到另一层则开始输出,并且判断当前节点是否为叶子节点,如果是则该层叶子节点数加一
*/
struct btree {
vector<int> child;
int l;
}node[110];
int leaf[110], maxh = -1;
void bfs(int s) {
queue<int> q;
q.push(s);
int cnt = 0;//叶子数
int lastl = -1;
while (!q.empty()) {
int top = q.front();
q.pop();
if (node[top].child.size() == 0 && node[top].l == lastl) cnt++;
if (node[top].l != lastl && node[top].l != 0) {
cout << cnt<<" ";
cnt = 0;
if (node[top].child.size() == 0) cnt++;
lastl = node[top].l;
}
for (int i = 0; i < node[top].child.size(); ++i) {
int child = node[top].child[i];
node[child].l = node[top].l + 1;
q.push(child);
}
}
cout << cnt;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < m; ++i) {
int indx, k;
cin >> indx >> k;
while (k--) {
int key;
cin >> key;
node[indx].child.push_back(key);
}
}
node[1].l = 0;
if (n == 1) cout << 1;
else bfs(1);
return 0;
}
09-17