from itertools import combinations


def parse_input():
    N, M = map(int, input().split())
    assert 1 <= N <= 1000
    assert 1 <= M <= 100

    flags = []
    for _ in range(N):
        ki = int(input())
        colori = set([int(cj) for cj in input().split()])
        assert ki == len(colori)
        flags.append(colori)

    return N, M, flags


def enumerate_pins_crayons_subsets(N, M):
    for i in range(N):
        for subset_pins in combinations(range(N), i):
            for j in range(M):
                yield from (
                    (subset_pins, subset_crayons)
                    for subset_crayons in combinations(range(1, M + 1), j)
                )


def check_support_every_one(flags, subset_pins, subset_crayons):
    subset_crayons = set(subset_crayons)
    for country, colors in enumerate(flags):
        if country not in subset_pins and not colors.issubset(subset_crayons):
            return False  # This country is not supported
    return True


N, M, flags = parse_input()
budget = min(N, M)
for subset_pins, subset_crayons in enumerate_pins_crayons_subsets(N, M):
    #print(subset_pins, subset_crayons)
    if check_support_every_one(flags, subset_pins, subset_crayons):
        budget = min(budget, len(subset_pins) + len(subset_crayons))

print(budget)
