// github.com/Johniel/contests // yukicoder/2780/main.cpp #include #define each(i, c) for (auto& i : c) #define unless(cond) if (!(cond)) using namespace std; template ostream& operator << (ostream& os, pair p); template istream& operator >> (istream& is, pair& p); template ostream& operator << (ostream& os, tuple t) { os << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")"; return os; } template istream& operator >> (istream& is, tuple& t) { is >> get<0>(t) >> get<1>(t) >> get<2>(t); return is; } template ostream& operator << (ostream& os, vector v) { os << "("; for (auto& i: v) os << i << ","; os << ")"; return os; } template istream& operator >> (istream& is, vector& v) { for (auto& i: v) is >> i; return is; } template ostream& operator << (ostream& os, set s) { os << "set{"; for (auto& i: s) os << i << ","; os << "}"; return os; } template ostream& operator << (ostream& os, map m) { os << "map{"; for (auto& i: m) os << i << ","; os << "}"; return os; } template istream& operator >> (istream& is, array& a) { for (auto& i: a) is >> i; return is; } template ostream& operator << (ostream& os, array& a) { os << "[" << N << "]{"; for (auto& i: a) os << i << ","; os << "}"; return os; } template ostream& operator << (ostream& os, stack s) { os << "stack{"; while (s.size()) { os << s.top() << ","; s.pop(); } os << "}"; return os; } template ostream& operator << (ostream& os, queue q) { os << "queue{"; while (q.size()) { os << q.front() << ","; q.pop(); } os << "}"; return os; } template ostream& operator << (ostream& os, deque q) { os << "deque{"; for (int i = 0; i < q.size(); ++i) os << q[i] << ","; os << "}"; return os; } template ostream& operator << (ostream& os, priority_queue q) { os << "heap{"; while (q.size()) { os << q.top() << ","; q.pop(); } os << "}"; return os; } template ostream& operator << (ostream& os, pair p) { os << "(" << p.first << "," << p.second << ")"; return os; } template istream& operator >> (istream& is, pair& p) { is >> p.first >> p.second; return is; } template inline T setmax(T& a, T b) { return a = std::max(a, b); } template inline T setmin(T& a, T b) { return a = std::min(a, b); } __attribute__((constructor)) static void _____(void) { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.setf(ios_base::fixed); cout.precision(15); return ; } using lli = long long int; using ull = unsigned long long; using str = string; template using vec = vector; namespace { // https://atcoder.jp/contests/typical90/tasks/typical90_u const int N = 1e5 + 3; bool vis[N]; void rec(vec graph[N], int curr, int ord[], int &cnt) { vis[curr] = true; for (auto& next : graph[curr]) { unless (vis[next]) rec(graph, next, ord, cnt); } ord[--cnt] = curr; return ; } vector g[N]; vector h[N]; void init(const int size) { fill(g, g + size, vector()); } int ord[N]; int scc[N]; vector> detect_scc(const int size) { int cnt, prev = size - 1; vector> ret; fill(ord, ord + size, -1); fill(scc, scc + size, -1); fill(h, h + size, vector()); for (int curr = 0; curr < size; ++curr) { for (const auto& next : g[curr]) { h[next].push_back(curr); } } cnt = size; fill(vis, vis + N, false); for (int i = 0; i < size; ++i) { unless (vis[i]) rec(g, i, ord, cnt); } cnt = size; fill(vis, vis + N, false); for (int i = 0; i < size; ++i) { unless (vis[ord[i]]) { rec(h, ord[i], scc, cnt); int j = prev; vector T; for (j = prev; 0 <= j && scc[j] != -1; --j) T.push_back(scc[j]); prev = j; ret.push_back(T); } } return ret; } }; int main(int argc, char *argv[]) { int n; while (cin >> n) { init(n); vec> es; for (int i = 0; i < n; ++i) { int m; cin >> m; for (int j = 0; j < m; ++j) { int x; cin >> x; --x; g[i].push_back(x); es.push_back(make_pair(i, x)); } } auto v = detect_scc(n); map m; for (int i = 0; i < v.size(); ++i) { each (j, v[i]) m[j] = i; } decltype(es) u; each (e, es) { e.first = m[e.first]; e.second = m[e.second]; if (e.first != e.second) u.push_back(e); } sort(u.begin(), u.end()); u.erase(unique(u.begin(), u.end()), u.end()); fill(g, g + n, vec()); vec rev[n]; each (i, u) { g[i.first].push_back(i.second); rev[i.second].push_back(i.first); } n = v.size(); vec leaf; for (int i = 0; i < n; ++i) { if (g[i].empty()) leaf.push_back(i); } bool f = true; f = f && (leaf.size() <= 1); if (leaf.size()) { set vis; int x = leaf.front(); while (rev[x].size()) { vis.insert(x); x = rev[x].front(); } vis.insert(x); f = f && (vis.size() == v.size() && m[0] == x); } cout << (f || (n == 1) ? "Yes" : "No") << endl; } return 0; }