using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Text;


class Program
{
    static bool[] visited;
    static bool[,] connect;
    static int N;
    static int M;
    static List<string> list;
    static void Main(string[] args)
    {
        int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
        N = input[0];
        M = input[1];

        //無向グラフ
        connect = new bool[N, N];
        visited = new bool[N];

        int[] a = new int[M];
        int[] b = new int[M];
        for (int i = 0; i < M; i++)
        {
            input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            a[i] = input[0] - 1;
            b[i] = input[1] - 1;
            connect[a[i], b[i]] = true;
            connect[b[i], a[i]] = true;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++)
        {
            sb.Append(i.ToString());
        }
        var tmp = sb.ToString();

        list = new List<string>();
        int res = 0;

        for (int j = 0; j < N; j++) visited[j] = false;

        dfs("0", N, 1);

        foreach (var item in list)
        {
            var c = item.ToCharArray();
            Array.Sort(c);
            var s = new string(c);
            if (s == tmp) res++;
        }

        Console.WriteLine(res);

    }
    static void dfs(string text, int n, int depth)
    {
        if (depth == n)
        {
            list.Add(text);
        }
        else
        {
            ++depth;

            if (text.Length < N && text[text.Length - 1] == '0')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[0, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '1')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[1, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '2')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[2, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '3')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[3, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '4')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[4, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '5')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[5, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '6')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[6, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '7')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[7, i]) dfs(text + i.ToString(), n, depth);
                }
            }
            if (text.Length < N && text[text.Length - 1] == '8')
            {
                for (int i = 0; i < N; i++)
                {
                    if (connect[8, i]) dfs(text + i.ToString(), n, depth);
                }
            }
        }
    }
}

Measured memory_bytes: 58400