include[HTML_REMOVED]
using namespace std;
const int N=110;
int n,m;
int e[N],ne[N],h[N],idx; //h[N]表示下一层最右边的节点序号,ne[N]表示每一层左边的邻接点的序号
int cnt[N],madep; //树的边数小于点数,故用N就能代表边数
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx;
}
void dfs(int u,int depth)
{
if(h[u]==-1)//u到达叶子节点
{
cnt[depth];//求相对应的层数的节点
madep=max(madep,depth);
return;
}
for(int i=h[u]; ~i; i=ne[i])dfs(e[i],depth+1); //从下一层开始遍历,是e[i]不是i,h[u]是与idx相关的,不代表真正的序号
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
while(m–)
{
int id,k,son;
cin>>id>>k;
while(k–)cin>>son,add(id,son);//建树
}
//在循环外面
dfs(1,0);
cout<<cnt[0];//保证输出最后没空格
for(int i=1; i<=madep; i++)cout<<’ ‘<<cnt[i];
return 0;
}