#include int rnd() { static std::random_device rd; static std::mt19937 gen(rd()); static std::uniform_int_distribution distrib(0, 1 << 30); return distrib(gen); } int main() { std::ios::sync_with_stdio(0); std::cin.tie(0); int n, m; std::cin >> n >> m; std::vector > in(n); std::vector > inse(n); std::vector a; for (int i = 0; i < n; i++) { int k; std::cin >> k; in[i].resize(k); for (int j = 0; j < k; j++) { std::cin >> in[i][j]; inse[i].insert(in[i][j]); } std::sort(in[i].begin(), in[i].end()); } std::vector mp(n); std::vector stk; auto f = [&] (auto&& self, const std::vector & v, int i) -> void { std::vector keep; for (int j = 0; j < (int) v.size(); j++) { if ((int) in[v[j]].size() == i) { a.emplace_back(v[j]); } else { keep.push_back(v[j]); } } std::sort(keep.begin(), keep.end(), [&] (int uu, int vv) -> bool { return in[uu][i] < in[vv][i]; }); std::vector sofar; for (int x : keep) { if (sofar.size() && in[sofar.back()][i] != in[x][i]) { self(self, sofar, i + 1); sofar.clear(); } sofar.push_back(x); } if (sofar.size()) { self(self, sofar, i + 1); } }; std::vector tmp(n); std::iota(tmp.begin(), tmp.end(), 0); f(f, tmp, 0); std::vector > bym(m + 1); n = a.size(); for (int i = 0; i < n; i++) { for (int j = 0; j < (int) in[a[i]].size(); j++) { bym[in[a[i]][j]].push_back(a[i]); } } int IT = 0; for(int entry = 1; entry <= m; ++entry){ for(int u = 0; u < (int)bym[entry].size(); u++){ for(int v = 0; v < (int)bym[entry].size(); v++){ if(in[bym[entry][u]].size() > in[bym[entry][v]].size() || u == v){ continue; } auto& su = in[bym[entry][u]]; auto& svse = inse[bym[entry][v]]; for(int i = 0; i < (int)su.size(); ++i){ if(!svse.count(su[i])){ // MATCH std::cout << "YES\n"; std::cout << bym[entry][u] + 1 << " " << bym[entry][v] + 1 << "\n"; return 0; } } } } } std::cout << "NO\n"; }