// Saarland University: <(OvO)> #include #define sz(a) ((int)(a).size()) #define divceil(a, b) ((a) + (b) - 1) / (b) using namespace std; #ifdef ONPC string to_string(const char* s) { return s; } template string to_string(const T& cont) { string ans = ""; for (bool fst = true; const auto& val: cont) { if (!fst) { ans += ", "; } ans += to_string(val); fst = false; } return ans + "}"; } void debug_print_collection() { cerr << endl; } template void debug_print_collection(First val, Args... args) { cerr << " " << to_string(val); debug_print_collection(args...); } #define debug(...) { cerr << "@@@ [" << #__VA_ARGS__ << "] ="; debug_print_collection(__VA_ARGS__);} #else #define debug(...) ; #define NDEBUG #endif mt19937 rnd(123); typedef long long ll; typedef long double ld; int solve() { int n; if (!(cin >> n)) { return 1; } int m; cin >> m; vector> g(n), gr(m); vector> q(n); for (int i = 0; i < n; i++) { int k; cin >> k; for (int j = 0; j < k; j++) { int a; cin >> a; a--; g[i].push_back(a); gr[a].push_back(i); q[i].insert(a); } } vector nxt(n, -1); auto check = [&](int i, int j) { if (sz(g[i]) > sz(g[j])) { swap(i, j); } bool havediff = false, havecomm = false; for (int x : g[i]) { if (!q[j].count(x)) { havediff = true; } else { havecomm = true; } } return havediff && havecomm; }; for (int j = 0; j < m; j++) { sort(gr[j].begin(), gr[j].end(), [&](int v, int u) { return make_pair(sz(g[v]), v) < make_pair(sz(g[u]), u); }); for (int i = 1; i < sz(gr[j]); i++) { int fr = gr[j][i - 1], t = gr[j][i]; if (nxt[fr] == -1) { nxt[fr] = t; if (check(fr, t)) { cout << "YES\n"; cout << fr + 1 << ' ' << t + 1 << '\n'; return 0; } } else if (nxt[fr] != t) { if (check(fr, t)) { cout << "YES\n"; cout << fr + 1 << ' ' << t + 1 << '\n'; return 0; } if (check(nxt[fr], t)) { cout << "YES\n"; cout << nxt[fr] + 1 << ' ' << t + 1 << '\n'; return 0; } } } } cout << "NO\n"; return 0; } int32_t main() { #ifdef ONPC assert(freopen("F.txt", "r", stdin)); #endif int TET = 1e9; // cin >> TET; for (int i = 1; i <= TET; i ++) { if (solve()) { break; } #ifdef ONPC cout << "__________________" << endl; #endif } #ifdef ONPC cerr << endl << "finished in " << clock() * 1.0 / CLOCKS_PER_SEC << " sec" << endl; #endif } /* g++ -std=c++20 -Wall -Wextra -Wshadow -D_GLIBCXX_DEBUG -DONPC -O2 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover -o ex template.cpp && ./ex */