#include <cstdarg>
#include <cstdio>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
//map记录ask_id与ans_id集合的映射关系
int N;
while(cin>>N){
std::map<int,std::set<int>> ask2ans;
std::set<int> badman;
for(int i=0; i<N; i++){//遍历问题
int ask_id;
std::cin>>ask_id;//输入提问者ID
int num;
cin>>num;//记录每个问题的回答个数
std::set<int> valid_ans;//记录有效答题人ID
for(int j=0; j<num; j++){//遍历答题人ID
//先排除自问自答,再排除重复
int id;
std::cin>>id;
auto it1 = valid_ans.find(id);
if(id!=ask_id && it1==valid_ans.end()){
valid_ans.insert(id);
}
}
auto it2 = ask2ans.find(ask_id);//看是ask_id是否提问过
if(it2!=ask2ans.end()){//ask_id提问过,合并ans_id集合
set<int> temp = it2->second;
valid_ans.insert(temp.begin(),temp.end());
}
ask2ans[ask_id] = valid_ans;
}
//寻找(ask,ans)与(ans,ask)的对应关系
for(auto it1 = ask2ans.begin(); it1!=ask2ans.end(); ++it1){//遍历ask_id的map
for(auto it2 = it1->second.begin(); it2 != it1->second.end(); ++it2){//遍历ans_id集合
auto it3 = ask2ans.find(*it2);//找ans_id的map
if(it3 !=ask2ans.end()){//(ask,ans)找到了(ans,X)
if(it3->second.find(it1->first)!=it3->second.end()){//(ask,ans)找到了(ans,ask)
badman.insert(it1->first);
badman.insert(it3->first);
}
}
}
}
//遍历每个人的问题回答者,超过两个作弊就将其也记为作弊
for(auto it1 = ask2ans.begin(); it1!=ask2ans.end(); ++it1){
int count=0;
for(auto it2 = it1->second.begin(); it2!=it1->second.end(); ++it2){
auto it3 = badman.find(*it2);
if(it3!=badman.end()){
count ++;
}
}
if(count>1){
badman.insert(it1->first);
}
}
std::cout<<badman.size()<<endl;
for(auto it = badman.begin(); it!=badman.end(); ++it){
cout<<*it<<" ";
}
if(badman.size()!=0){
cout<<endl;
}
}
return 0;
}
// 64 位输出请用 printf("%lld")