from collections import deque

import copy

# https://atcoder.jp/contests/abc054/tasks/abc054_c

# n!の全探索が答えというのは知っているが、自分の開放の誤りを見つけるために自分のやり方でといてみる。



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

V = [[] for _ in range(N)]

cont = [0 for _ in range(N)]

for _ in range(M):

    a, b = list(map(int, input().split()))

    V[a-1].append([b, copy.deepcopy(cont)])

    V[b-1].append([a, copy.deepcopy(cont)])



# solution

q = deque()

q.append([1, copy.deepcopy(cont)])

count = 0

while q:

    c_v = q.pop()

    c_v[1][c_v[0]-1] = 1

    next_vs = V[c_v[0]-1]

    ifComplete = 1

    for v in next_vs:

        if c_v[1][v[0]-1] == 1:

            continue

        else:

            ifComplete = 0

        # ここで続くvの探索が始まる時に全て訪問されていればcountを増やす。

        # その状態をどうやって管理すればいい？

        v[1] = copy.deepcopy(c_v[1])

        q.append(v)

    # 遷移先のノードが存在しない場合

    if ifComplete:

        flag = 1

        for x in c_v[1]:

            if x == 0:

                flag = 0

                break

        if flag:

            count += 1

print(count)

import itertools



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

V = [[] for _ in range(N)]

bag = set()

for _ in range(M):

    a, b = list(map(int, input().split()))

    bag.add(a)

    bag.add(b)

    V[a-1].append(b)

    V[b-1].append(a)



count = 0

for c in itertools.permutations(bag):

    if not c[0] == 1:

        continue

    flag = False

    for i in range(N-1):

        if not c[i+1] in V[c[i]-1]:

            flag = True

            break

    if not flag:

        count += 1

print(count)

from collections import deque
import copy

# https://atcoder.jp/contests/abc054/tasks/abc054_c
# n!の全探索が答えというのは知っているが、自分の開放の誤りを見つけるために自分のやり方でといてみる。
N, M = list(map(int, input().split()))
V = [[] for _ in range(N)]
cont = [0 for _ in range(N)]
for _ in range(M):
    a, b = list(map(int, input().split()))
    V[a - 1].append([b, copy.deepcopy(cont)])
    V[b - 1].append([a, copy.deepcopy(cont)])
# solution
q = deque()
q.append([1, copy.deepcopy(cont)])
count = 0
while q:
    c_v = q.pop()
    c_v[1][c_v[0] - 1] = 1
    next_vs = V[c_v[0] - 1]
    ifComplete = 1
    for v in next_vs:
        if c_v[1][v[0] - 1] == 1:
            continue
        else:
            ifComplete = 0
        # ここで続くvの探索が始まる時に全て訪問されていればcountを増やす。
        # その状態をどうやって管理すればいい？
        v[1] = copy.deepcopy(c_v[1])
        q.append(v)
    # 遷移先のノードが存在しない場合
    if ifComplete:
        flag = 1
        for x in c_v[1]:
            if x == 0:
                flag = 0
                break
        if flag:
            count += 1
print(count)

import itertools

N, M = list(map(int, input().split()))
V = [[] for _ in range(N)]
bag = set()
for _ in range(M):
    a, b = list(map(int, input().split()))
    bag.add(a)
    bag.add(b)
    V[a - 1].append(b)
    V[b - 1].append(a)
count = 0
for c in itertools.permutations(bag):
    if not c[0] == 1:
        continue
    flag = False
    for i in range(N - 1):
        if not c[i + 1] in V[c[i] - 1]:
            flag = True
            break
    if not flag:
        count += 1
print(count)

-from collections import deque -import copy +import itertools -# https://atcoder.jp/contests/abc054/tasks/abc054_c -# n!の全探索が答えというのは知っているが、自分の開放の誤りを見つけるために自分のやり方でといてみる。 -cont = [0 for _ in range(N)] +bag = set() -    V[a - 1].append([b, copy.deepcopy(cont)]) -    V[b - 1].append([a, copy.deepcopy(cont)]) -# solution -q = deque() -q.append([1, copy.deepcopy(cont)]) +    bag.add(a) +    bag.add(b) +    V[a - 1].append(b) +    V[b - 1].append(a) -while q: -    c_v = q.pop() -    c_v[1][c_v[0] - 1] = 1 -    next_vs = V[c_v[0] - 1] -    ifComplete = 1 -    for v in next_vs: -        if c_v[1][v[0] - 1] == 1: -            continue -        else: -            ifComplete = 0 -        # ここで続くvの探索が始まる時に全て訪問されていればcountを増やす。 -        # その状態をどうやって管理すればいい？ -        v[1] = copy.deepcopy(c_v[1]) -        q.append(v) -    # 遷移先のノードが存在しない場合 -    if ifComplete: -        flag = 1 -        for x in c_v[1]: -            if x == 0: -                flag = 0 -                break -        if flag: -            count += 1 +for c in itertools.permutations(bag): +    if not c[0] == 1: +        continue +    flag = False +    for i in range(N - 1): +        if not c[i + 1] in V[c[i] - 1]: +            flag = True +            break +    if not flag: +        count += 1