#include <bits/stdc++.h>
using namespace std;
int n, m, kk;
int f[1 << 10][1 << 10];
struct data {
  int u, v;
} line[100];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
inline int num(int x) {
  int cnt = 0;
  while (x) {
    cnt += (x & 1);
    x >>= 1;
  }
  return cnt;
}
int main() {
  n = read(), m = read(), kk = read();
  for (int i = 1; i <= m; i++) {
    line[i].u = line[i + m].v = read(), line[i].v = line[i + m].u = read();
  }
  m *= 2;
  memset(f, 0, sizeof(f));
  for (int i = 1; i <= n; i++) f[1 << (i - 1)][1 << (i - 1)] = 1;
  for (int i = 1; i < (1 << n); i++) {
    for (int j = 1; j < (1 << n); j++) {
      if ((j & i) != j) continue;
      for (int k = 1; k <= m; k++) {
        int u = line[k].u, v = line[k].v;
        if ((!(i & (1 << (u - 1)))) || (i & (1 << (v - 1)))) continue;
        int nxt;
        if ((j & (1 << (u - 1))) && num(j) != 1)
          nxt = j ^ (1 << (v - 1)) ^ (1 << (u - 1));
        else
          nxt = j ^ (1 << (v - 1));
        if (!(nxt >> v)) f[i | (1 << (v - 1))][nxt] += f[i][j];
      }
    }
  }
  int ans = 0;
  for (int i = 1; i < (1 << n); i++)
    if (num(i) == kk) ans += f[(1 << n) - 1][i];
  cout << ans << endl;
  return 0;
}
