#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 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]; } 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(i); } } constexpr const int MXIT = 40'000'000; int IT = 0; while (IT < MXIT) { IT++; int entry = rnd() % m + 1; if ((int) bym[entry].size() < 2) { continue; } int u = rnd() % (int) bym[entry].size(); int v; do { v = rnd() % (int) bym[entry].size(); } while (v == u); int i = 0, j = 0; auto& su = in[a[bym[entry][u]]]; auto& sv = in[a[bym[entry][v]]]; int len = 0; while (i < (int) su.size() && j < (int) sv.size()) { IT++; if (su[i] == sv[j]) i++, j++, len++; else if (su[i] < sv[j]) i++; else j++; } if (len == (int) std::min(su.size(), sv.size())) { continue; } // MATCH std::cout << "YES\n"; std::cout << a[bym[entry][u]] + 1 << " " << a[bym[entry][v]] + 1 << "\n"; return 0; } std::cout << "NO\n"; }