#include <bits/stdc++.h>
using namespace std;
set<tuple<array<int8_t, 13>, int, int>> p;
set<array<int8_t, 13>> s2, s1;
int n, m, k, e[15][15];
long long as, ct[15], tt = 1;
void dfs(array<int8_t, 13> a, int x, int y) {
  if (x < y) swap(x, y);
  a[x] = y;
  if (p.count(make_tuple(a, x, y))) return;
  p.insert(make_tuple(a, x, y));
  bool v[13] = {};
  for (int i = (1); i <= (n); i++)
    if (a[i]) v[i] = v[a[i]] = 1;
  if (*min_element(v + 1, v + n + 1)) {
    if (e[x][y]) s1.insert(a);
    return;
  }
  for (int i = (1); i <= (n); i++)
    if (e[x][i] && !v[i])
      for (int j = (1); j <= (n); j++)
        if (i != j && e[y][j] && !v[j]) dfs(a, i, j);
}
void sol(array<int8_t, 13> a, int x) {
  while (x <= n && a[x]) x++;
  if (x > n) {
    for (int i = (1); i <= (n); i++)
      if (a[a[i]]) a[i] = a[a[i]];
    s2.insert(a);
    return;
  }
  vector<int> v;
  for (int i = (x + 1); i <= (n); i++)
    if (!a[i]) v.push_back(i);
  int l = v.size();
  for (int s = (0); s <= ((1 << l) - 1); s++) {
    array<int8_t, 13> nw = a;
    for (int i = (0); i <= (l - 1); i++)
      if (s >> i & 1) nw[v[i]] = x;
    sol(nw, x + 1);
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  int x, y;
  for (int i = (1); i <= (n); i++) e[0][i] = e[i][0] = 1;
  for (int i = (1); i <= (m); i++) scanf("%d%d", &x, &y), e[x][y] = e[y][x] = 1;
  dfs(array<int8_t, 13>(), 0, 0);
  for (array<int8_t, 13> y : s1) sol(y, 1);
  for (array<int8_t, 13> a : s2) {
    int tt = 0;
    for (int i = (1); i <= (n); i++)
      if (!a[i]) tt++;
    ct[tt]++;
  }
  for (int i = (1); i <= (n / 2); i++) {
    tt = tt * (k - i + 1);
    as += tt * ct[i];
  }
  printf("%lld\n", as);
}
