#include using namespace std; const int MAXN = 200010; const int MAXM = 1000010; vector v[MAXN], buc[MAXM], maxs; int cnt[MAXM]; vector > srt; 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) { 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 x : srt) { int bucidx = x.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 (!isSubset(v[buc[bucidx][i-1]], v[buc[bucidx][i]])) { cout << "YES\n"; cout << buc[bucidx][i-1] << ' ' << buc[bucidx][i] << '\n'; return 0; } } } } cout << "NO"; return 0; }