#include #define pii pair using namespace std; const int MOD1 = (int)1e9 + 7; const int MOD2 = (int)1e9 + 9; vector v[200005]; vector poz[1000005]; map ap; int t[1000005]; bool comp(int a, int b) { return v[a].size() < v[b].size(); } bool check(int i, int j) { map fa, fb; for(auto &k : v[i]) fa[k]++; bool com = 0, dif1 = 0, dif2 = 0; for(auto &k : v[j]) { fb[k]++; if(fa[k]) com = 1; if(!fa[k]) dif1 = 1; // nu are a dar are b } for(auto &k : v[i]) { if(!fb[k]) dif2 = 1; // nu are b dar are a } return com && dif1 && dif2; } void solve() { int n, m; cin >> n >> m; for(int i = 1; i <= n; i++) { int k; cin >> k; v[i].resize(k); for(auto &j : v[i]) cin >> j; sort(v[i].begin(), v[i].end()); int h1 = 0, h2 = 0; for(auto &j : v[i]) { h1 = (1000003LL * h1 + j) % MOD1; h2 = (1000003LL * h2 + j) % MOD2; } if(ap.find(make_pair(h1, h2)) != ap.end()) { v[i].clear(); } ap[make_pair(h1, h2)] = 1; } for(int i = 1; i <= n; i++) { for(auto &j : v[i]) poz[j].push_back(i); } for(int val = 1; val <= m; val++) { if(poz[val].empty()) continue; sort(poz[val].begin(), poz[val].end(), comp); for(int i = 1; i < poz[val].size(); i++) { int a = poz[val][i - 1], b = poz[val][i]; if(v[a].size() == v[b].size()) { cout << "YES\n"; cout << a << " " << b << "\n"; return; } if(t[a] && t[a] != b) { if(check(a, t[a])) { cout << "YES\n" << a << " " << t[a] << "\n"; return; } cout << "YES\n" << a << " " << b << "\n"; return; } t[a] = b; } if(t[poz[val].back()] && t[poz[val].back()] != -1) { cout << "YES\n"; cout << t[poz[val].back()] << " " << poz[val].back() << "\n"; return; } t[poz[val].back()] = -1; } cout << "NO\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef LOCAL freopen("test.in", "r", stdin); freopen("test.out", "w", stdout); #else #endif int T = 1; //cin >> T; while(T--) { solve(); } return 0; }