//------------------------------>> tsukasa_diary's template <<------------------------------//
#include <bits/stdc++.h>
using namespace std;
#define for_(i,a,b) for(int i=(a);i<(b);++i)
#define for_rev(i,a,b) for(int i=(a);i>=(b);--i)
#define allof(a) (a).begin(),(a).end()
#define minit(a,b) memset(a,b,sizeof(a))
using lint = long long;
using pii = pair< int, int >;
template< typename T > using Vec = vector< T >;
template< typename T > bool in_range(T x, T lb, T ub) { return lb <= x && x < ub; }
template< typename T > bool in_range(T x, T y, T lb, T ub) { return in_range(x, lb, ub) && in_range(y, lb, ub); }
template< typename T > void modAdd(T& a, T b, T mod) { a = (a + b + mod) % mod; }
template< typename T > void modMul(T& a, T b, T mod) { a = (a * b) % mod; }
template< typename T > void minUpdate(T& a, T b) { a = min(a, b); }
template< typename T > void maxUpdate(T& a, T b) { a = max(a, b); }
int bitCount(int x) { return __builtin_popcount(x); }
int bitCount(lint x) { return __builtin_popcountll(x); }
const int dx[4] = {0,1,0,-1}, dy[4] = {-1,0,1,0};
const int Dx[8] = {0,1,1,1,0,-1,-1,-1}, Dy[8] = {-1,-1,0,1,1,1,0,-1};
const double EPS = 1e-9;
const double PI = acos(-1);
//--------------8---------------->> coding space <<-----------------8-------------//
int N, M;
Vec< Vec< int > > adj;
Vec< bool > vis;
void dfs(int v) {
if (vis[v]) return;
vis[v] = true;
for (int u : adj[v]) dfs(u);
}
int main() {
cin >> N >> M;
adj.assign(N + M, Vec< int >());
for_(i,0,N) {
int K;
cin >> K;
for_(j,0,K) {
int L;
cin >> L;
--L;
adj[i].push_back(N+L);
adj[N+L].push_back(i);
}
}
vis.assign(N+M, false);
dfs(0);
for_(i,0,N) {
if (!vis[i]) {
puts("NO");
return 0;
}
}
puts("YES");
}
//--------------8---------------->> coding space <<-----------------8-------------//