#include using namespace std; #define fwd(i, a, n) for (int i = (a); i < (n); i ++) #define rep(i, n) fwd(i, 0, n) #define all(X) begin(X), end(X) #define sz(X) ((int)X.size()) #define st first #define nd second #define pii pair #define vi vector #define ll long long #define ull unsigned long long #ifdef LOC auto &operator<<(auto &out, pair a) { return out << "(" << a.st << ", " << a.nd << ")"; } auto &operator<<(auto &out, auto a) { out << "{"; for (auto b : a) out << b << ", "; return out << "}"; } void dump(auto... x) { ((cerr << x << ", "), ...) << '\n'; } #define debug(x...) cerr << "[" #x "]: ", dump(x) #else #define debug(...) 0 #endif const int maxN = 1e6 + 100; vi ziomy[maxN]; int repr[maxN]; int fnd(int v) { return repr[v] == v ? v : repr[v] = fnd(repr[v]); } void uni(int v, int u) { v = fnd(v); u = fnd(u); if (v == u) return; if (sz(ziomy[u]) > sz(ziomy[v])) swap(v, u); repr[u] = v; for (auto x : ziomy[u]) ziomy[v].push_back(x); } int32_t main() { ios_base::sync_with_stdio(0), cin.tie(0); int n, m; cin >> n >> m; vector > dudes(n); vector > zbiorek(n); iota(repr, repr + m, 0); rep(i, m) ziomy[i].push_back(i); rep(i, n) { int k; cin >> k; rep(j, k) { int x; cin >> x; x --; dudes[i].nd.push_back(x); zbiorek[i].insert(x); } dudes[i].st = i; } sort(all(dudes), [&](auto &a, auto &b) { return sz(a.nd) < sz(b.nd); }); int bad_id = -1; for (auto [id, guys] : dudes) { if (sz(guys) < 2) continue; vi spujn; for (auto x : guys) spujn.push_back(fnd(x)); sort(all(spujn)); spujn.erase(unique(all(spujn)), end(spujn)); set guys_set; for (auto x : guys) guys_set.insert(x); bool fails = false; for (auto sp : spujn) { for (auto x : ziomy[sp]) { if (guys_set.find(x) == end(guys_set)) fails = true; } } if (fails) { bad_id = id; break; } rep(i, sz(spujn) - 1) uni(spujn[i], spujn[i + 1]); } if (bad_id == -1) { cout << "NO\n"; return 0; } rep(i, n) if (i != bad_id) { bool has_common = false; bool has_not = false; int a = bad_id; int b = i; if (sz(zbiorek[a]) > sz(zbiorek[b])) swap(a, b); for (auto x : zbiorek[a]) { auto lol = zbiorek[b].find(x); if (lol == end(zbiorek[b])) has_not = true; else has_common = true; } if (has_common && has_not) { cout << "YES\n"; cout << a + 1 << ' ' << b + 1 << '\n'; return 0; } } return 0; }