#include using namespace std; #define Dv(v) for (auto x : v) cerr << x << ' '; cerr << endl; #define D(x) cerr << #x << " = " << x << ", " #define x first #define y second using ll = long long; using vi = vector; using vvi = vector; using vpii = vector>; vi papa; vi big; vi rep; int pap(int a) { if(papa[a] == a) return a; return papa[a] = pap(papa[a]); } void merge(int a, int b) { a = pap(a); b = pap(b); if(a == b) return; papa[a] = b; big[b] += big[a]; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; m++; papa = big = rep = vi(m, 1); for(int i = 0; i < m; ++i) papa[i] = i; vpii siz; vvi sets(n); for(vi& v: sets) { int k; cin >> k; v = vi(k); for(int& x: v) cin >> x; } for(int i = 0; i < n; ++i) siz.push_back({sets[i].size(), i}); sort(siz.begin(), siz.end()); for(auto p_: siz) { // for(int t = 1; t < m; ++t) // cerr << t << ' ' << pap(t) << ' ' << big[t] << ' ' << rep[t] << endl; // cerr << endl; if(p_.x == 0) continue; int i = p_.y; // cerr << i << endl; unordered_map intersect; for(int j: sets[i]) intersect[pap(j)]++; for(auto p: intersect) if(p.y != big[p.x]) { // cerr << p.y << ' ' << p.x << endl; cout << "YES" << '\n'; cout << i+1 << ' ' << rep[p.x]+1 << '\n'; return 0; } for(auto p: intersect) merge(p.x, sets[i][0]); rep[pap(sets[i][0])] = i; } cout << "NO" << endl; }