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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;

namespace AtCorders
{
	public class Program
	{
		static void Main(string[] args)
		{
			var nm = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
			int n = nm[0];
			int m = nm[1];
			
			var hash = new HashSet<int>();
			
			var uf = new UnionFindTree(m);
			for (int i = 0; i < n; i++) {
				var kl = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
				int s = kl[0];
				for (int j = 1; j <= s - 1; j++) {
					uf.TryUnite(kl[j] - 1, kl[j + 1] - 1);
				}

				for (int j = 1; j <= s; j++) {
					hash.Add(kl[j] - 1);
				}
			}

			int parent = - 1;
			for (int i = 0; i < m; i++) {
				if (hash.Contains(i)) {
					if (parent == -1) {
						parent = uf.Find(i);
					} else {
						if (parent != uf.Find(i)) {
							Console.WriteLine("NO");
							return;
						}
					}
				}
			}

			Console.WriteLine("YES");
		}
	}

	public class UnionFindTree
	{
		private int[] sizes_;
		private int[] parent_;
		public int TreeCount { get; set; }

		public UnionFindTree(int n)
		{
			parent_ = new int[n];
			sizes_ = new int[n];
			for (int i = 0; i < n; i++) {
				parent_[i] = i;
				sizes_[i] = 1;
			}

			TreeCount = n;
		}

		public int Find(int x)
		{
			while (parent_[x] != x) {
				parent_[x] = parent_[parent_[x]];
				x = parent_[x];
			}

			return x;
		}

		public bool IsUnited(int x, int y)
		{
			return Find(x) == Find(y);
		}

		public void TryUnite(int x, int y)
		{
			int rootX = Find(x);
			int rootY = Find(y);
			if (rootX == rootY) {
				return;
			}

			int sizeX = sizes_[rootX];
			int sizeY = sizes_[rootY];
			if (sizeX < sizeY) {
				parent_[rootX] = rootY;
				sizes_[rootY] += sizeX;
			} else {
				parent_[rootY] = rootX;
				sizes_[rootX] += sizeY;
			}

			--TreeCount;
		}
	}
}