from collections import defaultdict from itertools import pairwise import sys sys.setrecursionlimit(10**6) def scc(n: int, adj: dict[int, list[int]]) -> list[list[int]]: """グラフを強連結成分分解する。 Args: n: 頂点数 adj: 隣接リスト {u: [v...]} Returns: 強連結成分のリスト (トポロジカル順) """ def dfs(v, used, acc): used[v] = True for to in adj[v]: if used[to]: continue dfs(to, used, acc) acc.append(v) def r_dfs(v, used, g): used[v] = True g.append(v) for to in r_adj[v]: if used[to]: continue r_dfs(to, used, g) r_adj = defaultdict(list) # 逆辺 for k, vs in adj.items(): for v in vs: r_adj[v].append(k) acc = [] used = [False] * n for i in range(n): if used[i]: continue dfs(i, used, acc) cc = [] used = [False] * n for node in reversed(acc): if used[node]: continue g = [] r_dfs(node, used, g) cc.append(g) return cc N = int(input()) adj = defaultdict(list) for i in range(N): M, *A = list(map(int, input().split())) for a in A: adj[i].append(a - 1) cc = scc(N, adj) for a, b in pairwise(cc): vset = set(b) ok = False for u in a: if any(v in vset for v in adj[u]): ok = True break if not ok: print('No') break else: print('Yes')