Problem:
Score : 400 points

Problem Statement

On a planet far, far away, M languages are spoken. They are conveniently numbered 1 through M.

For CODE FESTIVAL 20XX held on this planet, N participants gathered from all over the planet.

The i-th (1≦i≦N) participant can speak K_i languages numbered L_{i,1}, L_{i,2}, ..., L_{i,{}K_i}.

Two participants A and B can communicate with each other if and only if one of the following conditions is satisfied:

There exists a language that both A and B can speak.

There exists a participant X that both A and B can communicate with.

Determine whether all N participants can communicate with all other participants.

Constraints

2≦N≦10^5

1≦M≦10^5

1≦K_i≦M

(The sum of all K_i)≦10^5

1≦L_{i,j}≦M

L_{i,1}, L_{i,2}, ..., L_{i,{}K_i} are pairwise distinct.

Partial Score

200 points will be awarded for passing the test set satisfying the following: N≦1000, M≦1000 and (The sum of all K_i)≦1000.

Additional 200 points will be awarded for passing the test set without additional constraints.

Input

The input is given from Standard Input in the following format:

N M
K_1 L_{1,1} L_{1,2} ... L_{1,{}K_1}
K_2 L_{2,1} L_{2,2} ... L_{2,{}K_2}
:
K_N L_{N,1} L_{N,2} ... L_{N,{}K_N}

Output

If all N participants can communicate with all other participants, print YES. Otherwise, print NO.

Sample Input 1

4 6
3 1 2 3
2 4 2
2 4 6
1 6

Sample Output 1

YES

Any two participants can communicate with each other, as follows:

Participants 1 and 2: both can speak language 2.

Participants 2 and 3: both can speak language 4.

Participants 1 and 3: both can communicate with participant 2.

Participants 3 and 4: both can speak language 6.

Participants 2 and 4: both can communicate with participant 3.

Participants 1 and 4: both can communicate with participant 2.

Note that there can be languages spoken by no participant.

Sample Input 2

4 4
2 1 2
2 1 2
1 3
2 4 3

Sample Output 2

NO

For example, participants 1 and 3 cannot communicate with each other.

Solution in C (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>

typedef struct tag {
	int human;
	struct tag *next;
} lang;

lang* make(int human) {
	lang *new = NULL;
	
	new = (lang *)malloc(sizeof(lang));
	
	new->human = human;
	new->next = NULL;
	
	return new;
}

void add(lang *header, int human) {
	lang *prev = header;
	lang *next = make(human);
	header->human += 1;
	
	while(prev->next != NULL) {
		prev = prev->next;
	}
	prev->next = next;
}

void list_free(lang *header) {
	lang *tmp = header;
	lang *swap = NULL;
	
	while(tmp != NULL) {
		swap = tmp->next;
		free(tmp);
		tmp = swap;
	}
}

void print(lang *header) {
	lang *p = header;
	
	printf("%d:",p->human);
	p = p->next;
	while(p != NULL) {
		printf("%d ", p->human);
		p = p->next;
	}
	printf("\n");
}

int main(void) {
	int n,m,i,j,k,l;
	int group[100000] = {0};
	lang* commu[100000];
	
	scanf("%d %d",&n,&m);
	for (i = 0;i < m;i++) {
		commu[i] = make(0);
	}

	for (i = 0;i < n;i++) {
		scanf("%d",&k);
		for (j = 0;j < k;j++) {
			scanf("%d",&l);
			add(commu[l-1], i+1);
		}
	}
	
	lang* newCommu[100000];
	for (i = 0;i < m;i++) {
		newCommu[i] = make(0);
	}
	
	for (i = 0;i < m;i++) {
		if (commu[i]->human >= 2) {
			lang *p = commu[i]->next;
			while(p != NULL) {
				int cnt = p->human - 1;
				if (group[cnt] == 0) {
					group[cnt] = i;
				}
				add(newCommu[group[cnt]], cnt+1);
				p = p->next;
			}
		}
	}
	
	for (i = 0;i < m;i++) {
		if (commu[i]->human >= 2) {
			lang *p = commu[i]->next;
			int src = p->human;
			p = p->next;
			while(p != NULL) {
				int dst = p->human;
				if (group[src-1] != group[dst-1]) {
					int srcG = group[src-1];
					int dstG = group[dst-1];
					for (j = 0;j < n;j++) {
						if (group[j] == dstG) {
							group[j] = srcG;
						}
					}
					newCommu[srcG]->human += newCommu[dstG]->human;
					newCommu[dstG]->human = 0;
					lang *prev = newCommu[dstG];
					while(prev->next != NULL) {
						prev = prev->next;
					}
					lang *sp = newCommu[srcG]->next;
					sp = sp->next;
					prev->next = sp;
					newCommu[srcG]->next = prev;
				}
				p = p->next;
			}
		}
	}
	
	int ok = 1;
	int tmpG = group[0];
	for (i = 1;i < n;i++) {
		if (group[i] != tmpG) {
			ok = 0;
		}
	}
	
	printf("%s\n",ok?"YES":"NO");
	
	for (i = 0;i < m;i++) {
		list_free(commu[i]);
		list_free(newCommu[i]);
	}

	return 0;
}