#include <bits/stdc++.h>
using namespace std;
const int maxn = 12;
bitset<maxn> g[maxn];
map<long long, bool> vis;
int n, m, k, n2;
void dfs(int cur, vector<int>& a) {
  int id = find(a.begin(), a.end(), -1) - a.begin();
  if (id == n) {
    vector<int> pos1(n2, 0), pos2(n2, 0);
    vector<bitset<6>> dp(1 << n2);
    for (int i = 0; i < n; ++i) {
      pos1[a[i]] = pos2[a[i]];
      pos2[a[i]] = i;
    }
    for (int i = 0; i < n2; ++i)
      if (g[pos1[i]][pos2[i]]) dp[1 << i][i] = true;
    for (int i = 0; i < (1 << n2); ++i) {
      for (int j = 0; j < n2; ++j) {
        if (!dp[i][j]) continue;
        for (int k = 0; k < n2; ++k) {
          if ((i >> k) & 1) continue;
          dp[i | (1 << k)][k] =
              dp[i | (1 << k)][k] |
              (g[pos1[j]][pos1[k]] > 0 && g[pos2[j]][pos2[k]] > 0 ||
               g[pos1[j]][pos2[k]] > 0 && g[pos2[j]][pos1[k]] > 0);
          ;
        }
      }
    }
    for (int i = 0; i < n2; ++i) {
      if (dp[(1 << n2) - 1][i]) {
        long long num = 0;
        for (int j = 0; j < n; ++j) {
          num = num * 6 + a[j];
        }
        vis[num] = true;
        break;
      }
    }
    return;
  }
  for (int i = id + 1; i < n; ++i) {
    if (a[i] != -1) continue;
    a[i] = a[id] = cur;
    dfs(cur + 1, a);
    a[i] = a[id] = -1;
  }
}
bool dfs3(vector<int>& a) {
  vector<int> mp(n2, -1), cnt(n2, 0);
  int tot = 0;
  long long num = 0;
  for (int i = 0; i < n; ++i) {
    if (mp[a[i]] == -1) mp[a[i]] = tot++;
    num = num * 6 + mp[a[i]];
    cnt[a[i]]++;
  }
  if (vis.count(num)) return vis[num];
  for (int i = 0; i < n; ++i) {
    if (cnt[a[i]] < 4) continue;
    int x = a[i];
    for (int j = i + 1; j < n; ++j) {
      if (a[j] == a[i]) {
        a[i] = a[j] = tot;
        if (dfs3(a)) {
          a[i] = a[j] = x;
          return vis[num] = true;
        }
        a[i] = a[j] = x;
      }
    }
    break;
  }
  return vis[num] = false;
}
void dfs2(int cur, vector<int>& a) {
  int id = find(a.begin(), a.end(), -1) - a.begin();
  if (id == n) {
    dfs3(a);
    return;
  }
  for (int i = 0; i <= cur; ++i) {
    for (int j = id + 1; j < n; ++j) {
      if (a[j] != -1) continue;
      a[id] = a[j] = i;
      dfs2(max(cur, i + 1), a);
      a[id] = a[j] = -1;
    }
  }
}
long long fact[maxn + 2];
int main() {
  scanf("%d%d%d", &n, &m, &k);
  n2 = n >> 1;
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--, v--;
    g[u][v] = g[v][u] = 1;
  }
  vector<int> a(n, -1);
  dfs(0, a);
  dfs2(0, a);
  long long ans = 0;
  fact[0] = 1;
  for (int i = 1; i <= maxn; ++i) fact[i] = fact[i - 1] * i;
  for (map<long long, bool>::iterator it = vis.begin(); it != vis.end(); ++it) {
    if (it->second == false) continue;
    int mx = 0;
    long long num = it->first;
    while (num) {
      mx = max(1ll * mx, num % 6);
      num /= 6;
    }
    if (mx < k) {
      ans += fact[k] / fact[k - mx - 1];
    }
  }
  printf("%lld\n", ans);
}
