#include <bits/stdc++.h>
using namespace std;
const int N = 12;
const int M = 255;
template <typename T>
inline void read(T& x) {
  T f = 1, c = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    c = c * 10 + ch - '0';
    ch = getchar();
  }
  x = f * c;
}
int n, m, k, hed[N], cnt;
struct EG {
  int to, nxt;
} e[2 * M];
void ae(int f, int t) {
  e[++cnt].to = t;
  e[cnt].nxt = hed[f];
  hed[f] = cnt;
}
int count(int x) {
  int ret = 0;
  while (x) {
    ret++;
    x -= (x & (-x));
  }
  return ret;
}
int check(int s, int x) {
  int lim = 0;
  for (int i = n - 1; i > 0; i--)
    if (s & (1 << i)) {
      lim = i;
      break;
    }
  if (x < lim) return 0;
  return 1;
}
long long dp[1050][1050];
int main() {
  read(n), read(m), read(k);
  for (int f, t, i = 1; i <= m; i++) {
    read(f), read(t);
    f--, t--;
    ae(f, t), ae(t, f);
  }
  dp[1][1] = 1;
  for (int s1 = 1; s1 < (1 << n); s1 += 2) {
    for (int s2 = s1; s2; s2 = s1 & (s2 - 1)) {
      if (!dp[s1][s2]) continue;
      for (int f = 0; f < n; f++)
        if (s1 & (1 << f)) {
          for (int j = hed[f]; j; j = e[j].nxt) {
            int t = e[j].to;
            if (s1 & (1 << t)) continue;
            if (s1 != 1) {
              int v = (s2 | (1 << t)) & (((1 << n) - 1) ^ (1 << f));
              if (check(v, t)) dp[s1 | (1 << t)][v] += dp[s1][s2];
            } else {
              int v = s2 | (1 << t);
              dp[s1 | (1 << t)][v] += dp[s1][s2];
            }
          }
        }
    }
  }
  long long ans = 0;
  for (int i = 1; i < (1 << n); i++)
    if (count(i) == k) ans = ans + dp[(1 << n) - 1][i];
  printf("%lld\n", ans);
  return 0;
}
