#include using namespace std; using ll = long long; const ll INF = 1e18; const int N = 1e6 + 10; int used[N]; void solve() { // freopen("1.in", "r", stdin); // freopen("1.out", "w", stdout); map, int> mp; int n = 1000, m = 1000000 / 2; cin >> n >> m; vector> AA(n); // vector cur; for (int i = 0; i < n; i++) { // cur.push_back(i + 1); int k; cin >> k; vector a(k); for (int j = 0; j < k; j++) cin >> a[j]; // a = cur; sort(a.begin(), a.end()); AA[i] = a; mp[a] = i; } vector, int>> A; for (auto &[k, v]: mp) { A.push_back({k, v}); } sort(A.begin(), A.end(), [&](pair, int>& l,pair, int>& r) { if (l.first.size() == r.first.size()) return l.second < r.second; return l.first.size() < r.first.size(); }); map> mp1; vector> prev(n); for (auto& [a, v]: A){ prev[v].assign(a.size(), -1); for (int j = 0; j < a.size(); j++) { int i = a[j]; if (mp1.count(i) && mp1[i].first == a.size()) { cout << "YES\n" << v + 1 <<" " << mp1[i].second + 1 << "\n"; return; } if (mp1.count(i)) prev[v][j] = mp1[i].second; mp1[i] = {a.size(), v}; } } for (auto& [a, v]: A){ set to_check; for (int j = 0; j < a.size(); j++) { int i = a[j]; used[i] = 1; int p = prev[v][j]; if (p == -1) continue; to_check.insert(p); } for (auto x: to_check) { for (int i : AA[x]) { if (used[i] == 0) { cout << "YES\n" << x + 1 << " " << v + 1 << "\n"; // cout << i << "\n"; return; } } } for (int j = 0; j < a.size(); j++) { int i = a[j]; used[i] = 0; } } cout << "NO\n"; } int32_t main() { int t = 1; // cin >> t; while (t--) { solve(); } }