#include using namespace std; const int MAXN = 200010; const int MAXM = 1000010; const long long INF = 1000000000; vector v[MAXN], buc[MAXM]; int cnt[MAXM]; vector > srt; unordered_set sk; bool pos[MAXN]; bool isSubset(vector &a, vector &b) { int idx = 0; for (int i = 0; i < b.size(); i++) { while (idx+1 < a.size() && a[idx] < b[i]) { idx++; } if (a[idx] != b[i]) return false; } return true; } bool cmp(int a, int b) { if (v[a].size() == v[b].size()) return a < b; return v[a].size() > v[b].size(); } int main() { ios::sync_with_stdio(false); cin.tie(0); int N, M; cin >> N >> M; for (int i = 1; i <= N; i++) { int k; cin >> k; for (int j = 1; j <= k; j++) { int x; cin >> x; v[i].push_back(x); buc[x].push_back(i); cnt[x]++; } } for (int i = 1; i <= N; i++) { sort(v[i].begin(), v[i].end()); } for (int i = 1; i <= M; i++) { srt.push_back({cnt[i], i}); } sort (srt.rbegin(), srt.rend()); for (auto p : srt) { //cerr << "BUCKETS " << p.first << ' ' << p.second << endl; int bucidx = p.second; /*bool maximal = true; for (auto x : buc[bucidx]) { if (pos[x]) { maximal = false; } }*/ //if (maximal) { //for (auto x : buc[bucidx]) { // pos[x] = true; //} sort(buc[bucidx].begin(), buc[bucidx].end(), cmp); for (int i = 1; i < buc[bucidx].size(); i++) { if (sk.find(INF*buc[bucidx][i-1]+buc[bucidx][i]) == sk.end()) { if (!isSubset(v[buc[bucidx][i-1]], v[buc[bucidx][i]])) { cout << "YES\n"; cout << buc[bucidx][i-1] << ' ' << buc[bucidx][i] << '\n'; return 0; } else { sk.insert(INF*buc[bucidx][i-1]+buc[bucidx][i]); } } } //} } cout << "NO"; return 0; }