source_code: import java.io.IOException;
  import java.io.InputStream;
  import java.io.PrintWriter;
  import java.math.BigInteger;
  import java.util.Arrays;
  import java.util.InputMismatchException;
  
  /**
   * @author Egor Kulikov (egor@egork.net)
   *         Created on 14.03.2010
   */
  public class TaskD implements Runnable {
  	private InputReader in;
  	private PrintWriter out;
  	private int n;
  	private int m;
  	private boolean[][] e;
  	private long[][] qp;
  
  	private static class InputReader {
  		private InputStream stream;
  		private byte[] buf = new byte[1000];
  		private int curChar, numChars;
  
  		public InputReader(InputStream stream) {
  			this.stream = stream;
  		}
  
  		private int read() {
  			if (numChars == -1)
  				throw new InputMismatchException();
  			if (curChar >= numChars) {
  				curChar = 0;
  				try {
  					numChars = stream.read(buf);
  				} catch (IOException e) {
  					throw new InputMismatchException();
  				}
  				if (numChars <= 0)
  					return -1;
  			}
  			return buf[curChar++];
  		}
  
  		public int readInt() {
  			int c = read();
  			while (isSpaceChar(c))
  				c = read();
  			int sgn = 1;
  			if (c == '-') {
  				sgn = -1;
  				c = read();
  			}
  			int res = 0;
  			do {
  				if (c < '0' || c > '9')
  					throw new InputMismatchException();
  				res *= 10;
  				res += c - '0';
  				c = read();
  			} while (!isSpaceChar(c));
  			return res * sgn;
  		}
  
  		public long readLong() {
  			int c = read();
  			while (isSpaceChar(c))
  				c = read();
  			int sgn = 1;
  			if (c == '-') {
  				sgn = -1;
  				c = read();
  			}
  			long res = 0;
  			do {
  				if (c < '0' || c > '9')
  					throw new InputMismatchException();
  				res *= 10;
  				res += c - '0';
  				c = read();
  			} while (!isSpaceChar(c));
  			return res * sgn;
  		}
  
  		public String readString() {
  			int c = read();
  			while (isSpaceChar(c))
  				c = read();
  			StringBuffer res = new StringBuffer();
  			do {
  				res.appendCodePoint(c);
  				c = read();
  			} while (!isSpaceChar(c));
  			return res.toString();
  		}
  
  		private boolean isSpaceChar(int c) {
  			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
  		}
  
  		private String readLine0() {
  			StringBuffer buf = new StringBuffer();
  			int c = read();
  			while (c != '\n' && c != -1) {
  				buf.appendCodePoint(c);
  				c = read();
  			}
  			return buf.toString();
  		}
  
  		public String readLine() {
  			String s = readLine0();
  			while (s.trim().length() == 0)
  				s = readLine0();
  			return s;
  		}
  
  		public String readLine(boolean ignoreEmptyLines) {
  			if (ignoreEmptyLines)
  				return readLine();
  			else
  				return readLine0();
  		}
  
  		public BigInteger readBigInteger() {
  			try {
  				return new BigInteger(readString());
  			} catch (NumberFormatException e) {
  				throw new InputMismatchException();
  			}
  		}
  
  		public char readCharacter() {
  			int c = read();
  			while (isSpaceChar(c))
  				c = read();
  			return (char) c;
  		}
  
  		public double readDouble() {
  			int c = read();
  			while (isSpaceChar(c))
  				c = read();
  			int sgn = 1;
  			if (c == '-') {
  				sgn = -1;
  				c = read();
  			}
  			double res = 0;
  			while (!isSpaceChar(c) && c != '.') {
  				if (c < '0' || c > '9')
  					throw new InputMismatchException();
  				res *= 10;
  				res += c - '0';
  				c = read();
  			}
  			if (c == '.') {
  				c = read();
  				double m = 1;
  				while (!isSpaceChar(c)) {
  					if (c < '0' || c > '9')
  						throw new InputMismatchException();
  					m /= 10;
  					res += (c - '0') * m;
  					c = read();
  				}
  			}
  			return res * sgn;
  		}
  	}
  
  	public static void main(String[] args) {
  //		new Thread(new Template()).start();
  		new TaskD().run();
  	}
  
  	public TaskD() {
  //		String id = getClass().getName().toLowerCase();
  //		try {
  //			System.setIn(new FileInputStream(id + ".in"));
  //			System.setOut(new PrintStream(new FileOutputStream(id + ".out")));
  //		} catch (FileNotFoundException e) {
  //			throw new RuntimeException();
  //		}
  		in = new InputReader(System.in);
  		out = new PrintWriter(System.out);
  	}
  
  	public void run() {
  //        int numTests = in.readInt();
  //        for (int testNumber = 0; testNumber < numTests; testNumber++) {
  //        }
  		n = in.readInt();
  		m = in.readInt();
  		e = new boolean[n][n];
  		for (int i = 0; i < m; i++) {
  			int a = in.readInt() - 1;
  			int b = in.readInt() - 1;
  			e[a][b] = e[b][a] = true;
  		}
  //		n = 19;
  //		e = new boolean[n][n];
  //		for (int i = 0; i < n; i++) {
  //			for (int j = 0; j < n; j++)
  //				e[i][j] = i != j;
  //		}
  		int msk = (1 << n) - 1;
  		qp = new long[n - 1][1 << (n - 1)];
  		long ans = 0;
  		for (int i = n - 1; i >= 0; i--) {
  			msk -= (1 << i);
  			for (int k = 0; k < i; k++)
  				Arrays.fill(qp[k], 0, 1 << i, -1);
  			for (int j = 0; j < i; j++) {
  				if (e[i][j]) {
  					e[i][j] = e[j][i] = false;
  					ans += go(j, msk - (1 << j), i);
  					e[i][j] = e[j][i] = true;
  				}
  			}
  		}
  		out.println(ans / 2);
  		out.close();
  	}
  
  	private long go(int v, int msk, int u) {
  		if (qp[v][msk] != -1)
  			return qp[v][msk];
  		qp[v][msk] = 0;
  		if (e[v][u])
  			qp[v][msk] = 1;
  		for (int i = 0; i < u; i++) {
  			if (e[v][i] && ((msk >> i) & 1) != 0)
  				qp[v][msk] += go(i, msk - (1 << i), u);
  		}
  		return qp[v][msk];
  	}
  }