#include <bits/stdc++.h>
using namespace std;
const long long N = 1 << 10 | 1;
const long long M = 19;
long long m[M][M];
long long f[N][N];
long long n, Edge, k;
long long cnt[N];
long long read() {
  long long f = 1, x = 0;
  char s = getchar();
  while (s < '0' || s > '9') {
    if (s == '-') f = -1;
    s = getchar();
  }
  while (s >= '0' && s <= '9') {
    x = (x << 1) + (x << 3) + (s ^ '0');
    s = getchar();
  }
  return f * x;
}
void Prepare(long long i) {
  long long x = i;
  while (x) {
    if (x & 1) cnt[i]++;
    x >>= 1;
  }
}
long long mx;
void DP() {
  for (long long i = 1; i < mx; i++)
    for (long long j = i; j; j = (j - 1) & i)
      if (f[i][j]) {
        for (long long k = 1; k <= n; k++) {
          if (i & (1 << (k - 1)))
            for (long long v = 1; v <= n; v++)
              if (m[k][v] and !(i & (1 << (v - 1)))) {
                long long l = 0;
                if (cnt[i] == 1)
                  l = i | (1 << (v - 1));
                else {
                  l = (j & (~(1 << (k - 1))));
                  l |= (1 << (v - 1));
                }
                if (!(l >> v)) f[i | (1 << (v - 1))][l] += f[i][j];
              }
        }
      }
}
long long ans;
signed main() {
  n = read();
  Edge = read();
  k = read();
  mx = (1 << n);
  for (long long i = 1; i <= Edge; i++) {
    long long u = read();
    long long v = read();
    m[u][v] = 1;
    m[v][u] = 1;
  }
  for (long long i = 1; i < mx; i <<= 1) f[i][i] = 1;
  for (long long i = 0; i < mx; i++) Prepare(i);
  DP();
  for (long long i = 0; i < mx; i++)
    if (cnt[i] == k) ans += f[mx - 1][i];
  cout << ans << endl;
  return 0;
}
