#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

typedef pair<int, int> P;

struct UF {
	int n;
	vector<int>d;
	UF() {}
	UF(int n) :n(n), d(n, -1) {}

	int root(int v) {
		if (d[v] < 0) { return v; }
		return d[v] = root(d[v]);
	}
	bool unite(int x, int y) {
		x = root(x);
		y = root(y);
		if (x == y) { return false; }
		if (size(x) < size(y)) { swap(x, y); }
		d[x] += d[y];
		d[y] = x;
		return true;
	}
	int size(int v) { return -d[root(v)]; }
};

int L[100005];
int lang[100005];

int main() {

	int N, M;

	scanf("%d %d", &N, &M);

	int i, j;

	int K;

	UF t(100005);

	for (j = 0; j < N; j++) {

		scanf(" %d", &K);

		for (i = 0; i < K; i++) {
			scanf(" %d", &L[i]);
			lang[L[i]]++;
		}
		for (i = 0; i < K - 1; i++) {
			t.unite(L[i], L[i + 1]);
		}

	}
	int si = 0;
	for (i = 1; i <= 100000; i++) {
		if (lang[i] > 0) {
			si++;
		}
	}
	int flag = 0;
	for (i = 1; i <= 100000; i++) {
		if (lang[i] > 0) {
			if (t.size(i) != si) { 
				flag = 1; 
				break; 
			}
			else {
				break;
			}
		}
	}
	if (flag == 1) { printf("NO\n"); }
	else { printf("YES\n"); }

	return 0;
}