import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
//邻接表
static List<List<Integer>> graph;
static int[] visited;
static boolean[] hasZuoBi;
static int res;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int N = sc.nextInt();
graph = new ArrayList<>(); // 初始化邻接表
visited = new int[N];
hasZuoBi = new boolean[N];
res = 0; // 重置结果计数器
for (int i = 0; i < N; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i < N; i++) {
graph.add(new ArrayList<>());
int node = sc.nextInt() - 1;
int k = sc.nextInt();
for (int j = 0; j < k; j++) {
int nodeNext = sc.nextInt() - 1;
graph.get(node).add(nodeNext);
}
}
// System.out.println(graph);
//第一轮去找双向箭头的节点即成环的
for (int i = 0; i < N; i++) {
dfs(i, graph);
}
// System.out.println(Arrays.toString(hasZuoBi));
//找到连接两个作弊的节点
for (int i = 0; i < N; i++) {
if (hasZuoBi[i]) {
continue;
} else {
List<Integer> temp = graph.get(i);
if (temp.size() >= 2) {
boolean tag = true;
for (int nodeNext : temp) {
//如果有一个没作弊
if (!hasZuoBi[nodeNext]) {
tag = false;
break;
}
}
hasZuoBi[i] = tag;
}
}
}
for (int i = 0; i < N; i++) {
if (hasZuoBi[i]) {
res++;
}
}
System.out.println(res);
if (res != 0) {
for (int i = 0; i < N; i++) {
if (hasZuoBi[i]) {
System.out.print((i + 1) + " ");
}
}
//在多个case里面进行换行
System.out.println(); // 换行
}
}
}
private static void dfs(int node, List<List<Integer>> graph) {
if (visited[node] == -1) {
return;
}
visited[node] = 1;
for (int nodeNext : graph.get(node)) {
if (node == nodeNext) continue;
if (visited[nodeNext] == 1) {
hasZuoBi[nodeNext] = true;
hasZuoBi[node] = true;
return;
} else if (visited[nodeNext] == 0) {
dfs(nodeNext, graph);
}
}
visited[node] = -1;
}
}