//入度最大的一定可能胜利,
//然后用这些可能胜利的点去试那些不确定的点,
//因为可能胜利的点无法判断是否打赢的点一定是可能胜利的。
//这样用队列维护可能胜利的点,用链表维护不确定的点,
//根据边的大小决定枚举方向,最终复杂度O(n)
#include<cstdio>
#include<iostream>#include<algorithm>
#include<cmath>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int maxn = 2000000;
int h[maxn],nx[maxn],to[maxn],cnt;
int chudu[maxn];
int pr[maxn],af[maxn];
bool isWinner[maxn];
int cnt_winner;
int n;
int q[maxn],l,r;
void add_edge(int u,int v){
cnt++;
to[cnt]=v;
nx[cnt]=h[u];
h[u]=cnt;
}
void del(int nd){
af[pr[nd]]=af[nd];
pr[af[nd]]=pr[nd];
}
void bfs(){
while(l<r){
int t=q[l++];
t=h[t];
int x=pr[n+1];
while(x!=0){
while(x<to[t] && t!=0){
t=nx[t];
}
if(x!=to[t]){
isWinner[x]=1;
del(x);
cnt_winner++;
q[r++]=x;
}
x=pr[x];
}
}
}
int main(){
int max_chudu=0;
cin>>n;
for(int i=1;i<=n+1;i++){
pr[i]=i-1;af[i]=i+1;
}
for(int i=1;i<=n;i++){
cin>>chudu[i];
max_chudu=max(max_chudu,chudu[i]);
for(int j=chudu[i];j>0;j--){
int a;
cin>>a;
add_edge(i,a);
}
}
for(int i=1;i<=n;i++){
if(chudu[i]==max_chudu){
q[r++]=i,isWinner[i]=1;del(i);cnt_winner++;
}
}
bfs();
printf("%d",cnt_winner);
for(int i=1;i<=n;i++)if(isWinner[i])printf(" %d",i);
return 0;
}