#include //#pragma GCC optimize("O3") //#define int long long using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; signed main(){ cin.tie(0); ios::sync_with_stdio(0); int n; cin >> n; int m; cin >> m; unordered_map val2id; vector> szi(n); vector> a(n); vector> aa(n); for (int i = 0; i < n; ++i) { int cnt; cin >> cnt; szi[i] = {cnt, i}; a[i].resize(cnt); for (int& v : a[i]) cin >> v; aa[i] = unordered_set(a[i].begin(), a[i].end()); } auto check = [&] (int i, int j) { for (int v : a[j]) if (!aa[i].count(v)) return true; return false; }; sort(szi.begin(), szi.end()); for (auto [sz, i] : szi) { unordered_set checked; for (int v : a[i]) { if (val2id.count(v)) { int p = val2id[v]; if (checked.count(p)) { } else { if (check(i, p)) { cout << "YES\n" << i + 1 << ' ' << p + 1 << '\n'; return 0; } } } val2id[v] = i; } } cout << "NO\n"; }