# encoding: utf-8

N, M = list(map(int, input().split()))

ab = [list(map(int, input().split())) for i in range(M)]



route = [[] for i in range(N)]



for ai, bi in ab:

    route[ai - 1].append(bi - 1)

    route[bi - 1].append(ai - 1)



def walk(pos, pos_prev, footprint):

    # print("#", pos, footprint)

    footprint = (2 ** pos) | footprint

    ret = footprint

    for pos_next in route[pos]:

        # print("##", pos_next, (2 ** pos_next) & footprint)

        if (2 ** pos_next) & footprint > 0: continue

        ret = ret | walk(pos_next, pos, footprint)

    return ret



ans = 0

for ai, bi in ab:

    # temporary remove

    route[ai - 1].remove(bi - 1)

    route[bi - 1].remove(ai - 1)

    # connection check

    if walk(0, -1, 0) < (2 ** N - 1): ans += 1

    # recovery

    route[ai - 1].append(bi - 1)

    route[bi - 1].append(ai - 1)



print(ans)

# encoding: utf-8

N, M = list(map(int, input().split()))

ab = [list(map(int, input().split())) for i in range(M)]



route = [[] for i in range(N)]



for ai, bi in ab:

    route[ai - 1].append(bi - 1)

    route[bi - 1].append(ai - 1)



def walk(pos, pos_prev, footprint):

    # print("#", pos, footprint)

    footprint = (2 ** pos) | footprint

    ret = footprint

    for pos_next in route[pos]:

        # print("##", pos_next, (2 ** pos_next) & footprint)

        if (2 ** pos_next) & footprint > 0: continue

        ret = ret | walk(pos_next, pos, footprint)

        if ret == (2 ** N - 1): return 2 ** N - 1 # speed test

    return ret



ans = 0

for ai, bi in ab:

    # temporary remove

    route[ai - 1].remove(bi - 1)

    route[bi - 1].remove(ai - 1)

    # connection check

    if walk(0, -1, 0) < (2 ** N - 1): ans += 1

    # recovery

    route[ai - 1].append(bi - 1)

    route[bi - 1].append(ai - 1)



print(ans)

# encoding: utf-8
N, M = list(map(int, input().split()))
ab = [list(map(int, input().split())) for i in range(M)]
route = [[] for i in range(N)]
for ai, bi in ab:
    route[ai - 1].append(bi - 1)
    route[bi - 1].append(ai - 1)


def walk(pos, pos_prev, footprint):
    # print("#", pos, footprint)
    footprint = (2**pos) | footprint
    ret = footprint
    for pos_next in route[pos]:
        # print("##", pos_next, (2 ** pos_next) & footprint)
        if (2**pos_next) & footprint > 0:
            continue
        ret = ret | walk(pos_next, pos, footprint)
    return ret


ans = 0
for ai, bi in ab:
    # temporary remove
    route[ai - 1].remove(bi - 1)
    route[bi - 1].remove(ai - 1)
    # connection check
    if walk(0, -1, 0) < (2**N - 1):
        ans += 1
    # recovery
    route[ai - 1].append(bi - 1)
    route[bi - 1].append(ai - 1)
print(ans)

# encoding: utf-8
N, M = list(map(int, input().split()))
ab = [list(map(int, input().split())) for i in range(M)]
route = [[] for i in range(N)]
for ai, bi in ab:
    route[ai - 1].append(bi - 1)
    route[bi - 1].append(ai - 1)


def walk(pos, pos_prev, footprint):
    # print("#", pos, footprint)
    footprint = (2**pos) | footprint
    ret = footprint
    for pos_next in route[pos]:
        # print("##", pos_next, (2 ** pos_next) & footprint)
        if (2**pos_next) & footprint > 0:
            continue
        ret = ret | walk(pos_next, pos, footprint)
        if ret == (2**N - 1):
            return 2**N - 1  # speed test
    return ret


ans = 0
for ai, bi in ab:
    # temporary remove
    route[ai - 1].remove(bi - 1)
    route[bi - 1].remove(ai - 1)
    # connection check
    if walk(0, -1, 0) < (2**N - 1):
        ans += 1
    # recovery
    route[ai - 1].append(bi - 1)
    route[bi - 1].append(ai - 1)
print(ans)

+        if ret == (2**N - 1): +            return 2**N - 1  # speed test