#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T qmin(const T &a, const T &b) {
  return a < b ? a : b;
}
template <typename T>
inline T qmax(const T &a, const T &b) {
  return a > b ? a : b;
}
template <typename T>
inline void getmin(T &a, const T &b) {
  if (a > b) a = b;
}
template <typename T>
inline void getmax(T &a, const T &b) {
  if (a < b) a = b;
}
inline void fileio(string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
const int inf = (int)1e9 + 7;
const long long linf = (long long)1e17 + 7;
const int N = 11;
int f[1024][1024];
int n, m, k;
int g[N][N];
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (register int i = (1); i <= (m); ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    --x, --y;
    g[x][y] = g[y][x] = 1;
  }
  for (register int i = 0; i < (n); ++i) {
    for (register int j = (i + 1); j <= (n - 1); ++j) {
      if (!g[i][j]) continue;
      int u = (1 << i) | (1 << j);
      f[u][u] = 1;
    }
  }
  int all = (1 << n) - 1;
  for (register int comb = (3); comb <= (all); ++comb) {
    int sub = comb;
    do {
      int cur = f[comb][sub];
      if (cur) {
        for (register int i = 0; i < (n); ++i) {
          if (!(comb >> i & 1)) continue;
          for (register int j = 0; j < (n); ++j) {
            if ((comb >> j & 1) || !g[i][j] || ((sub & ~(1 << i)) >> j))
              continue;
            f[comb | (1 << j)][(sub & ~(1 << i)) | (1 << j)] += cur;
          }
        }
      }
      sub = (sub - 1) & comb;
    } while (sub != comb);
  }
  int ans = 0;
  for (register int i = (1 << n) - 1; i >= 0; --i)
    if (__builtin_popcount(i) == k) ans += f[all][i];
  printf("%d\n", ans);
  return 0;
}
