source_code: //package round11;
  
  
  import java.io.BufferedOutputStream;
  import java.io.PrintStream;
  import java.io.PrintWriter;
  import java.io.StringReader;
  import java.util.Arrays;
  import java.util.Scanner;
  
  public class D {
  	private Scanner in;
  	private PrintWriter out;
  	
  	private boolean[][] g;
  	
  	public void solve()
  	{
  		n = ni();
  		int m = ni();
  		g = new boolean[n][n];
  		for(int i = 0;i < m;i++){
  			int f = ni();
  			int t = ni();
  			g[f-1][t-1] = true;
  			g[t-1][f-1] = true;
  		}
  		
  		long ret = 0L;
  		cache = new long[20 << 19];
  		for(int i = 0;i < n;i++){
  			start = i;
  			ret += rec(1 << start, i, 0);
  		}
  		out.println(ret/2);
  	}
  	
  	private long[] cache;
  	private int n;
  	private int start;
  	
  	private long rec(int passed, int cur, int depth)
  	{
  		int code = cur << 19 | passed;
  		if(cache[code] != 0)return cache[code];
  		long ret = 0L;
  		
  		if(g[cur][start] && depth >= 2)ret++;
  		for(int i = start + 1;i < n;i++){
  			if((passed & (1 << i)) == 0 && g[cur][i]){
  				ret += rec(passed | (1 << i), i, depth + 1);
  			}
  		}
  		
  		cache[code] = ret;
  		return ret;
  	}
  	
  	public void run() throws Exception
  	{
  //		int m = 19;
  //		StringBuilder sb = new StringBuilder();
  //		sb.append(m + " ");
  //		sb.append((m*(m-1)/2) + " ");
  //		for(int i = 1;i <= m;i++){
  //			for(int j = i + 1;j <= m;j++){
  //				sb.append(i + " " + j + "\n");
  //			}
  //		}
  //		
  //		in = new Scanner(new StringReader(sb.toString()));
  //		in = new Scanner(new StringReader("4 6 1 2 1 3 1 4 2 3 2 4 3 4"));
  		in = new Scanner(System.in);
  		System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  		out = new PrintWriter(System.out);
  		
  //		int n = in.nextInt();
  		int n = 1;
  		for(int i = 1;i <= n;i++){
  			long t = System.currentTimeMillis();
  			solve();
  			out.flush();
  			System.err.printf("%04d/%04d %7d%n", i, n, System.currentTimeMillis() - t);
  		}
  	}
  	
  	
  	public static void main(String[] args) throws Exception
  	{
  		new D().run();
  	}
  	
  	private int ni() { return Integer.parseInt(in.next()); }
  	private static void tr(Object... o) { System.out.println(o.length == 1 ? o[0] : Arrays.toString(o)); }
  	private void tra(int[] a) {System.out.println(Arrays.toString(a));}
  	private void tra(int[][] a)
  	{
  		for(int[] e : a){
  			System.out.println(Arrays.toString(e));
  		}
  	}
  	
  }
  