from collections import defaultdict import sys sys.setrecursionlimit(10 ** 6) # n : 頂点数 # 辺 : {u: [v...]} # return : 強連結成分のリスト (トポロジカルソート順) def scc(n, adj) -> list: def dfs(node, used, acc): used[node] = True for to in adj[node]: if used[to]: continue dfs(to, used, acc) acc.append(node) def r_dfs(node, used, g): used[node] = True g.append(node) for to in radj[node]: if used[to]: continue r_dfs(to, used, g) radj = defaultdict(list) # 逆辺 for k, vs in adj.items(): for v in vs: radj[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) ss = scc(N, adj) group_inds = [0] * N for i, cc in enumerate(ss): for x in cc: group_inds[x] = i # SCC の先頭に 0 が含まれない if 0 not in ss[0]: print('No') exit() # SCC の各グループから次の SCC へ遷移できるか for i in range(len(ss)-1): ok = False for x in ss[i]: for y in adj[x]: if group_inds[y] == i+1: ok = True break if not ok: print('No') exit() print('Yes')