#include <bits/stdc++.h>
using namespace std;
template <typename T>
void cmax(T& x, T y) {
  if (x < y) x = y;
}
template <typename T>
void cmin(T& x, T y) {
  if (y < x) x = y;
}
inline int read() {
  int f = 1, x = 0;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return f * x;
}
const int N = 13;
int n, m, k, E[N][N], cnt[N];
struct T {
  int a[N];
  T() { memset(a, 0, sizeof(a)); }
  bool operator<(const T& o) const {
    for (int i = (1); i <= (12); i++)
      if (a[i] != o.a[i]) return a[i] < o.a[i];
    return 0;
  }
};
struct TT {
  T a;
  int x, y;
  bool operator<(const TT& o) const {
    if (a < o.a || o.a < a) return a < o.a;
    if (x != o.x) return x < o.x;
    return y < o.y;
  }
};
set<T> S1, S2;
set<TT> S;
inline void dfs(T arr, int x, int y) {
  if (x > y) swap(x, y);
  arr.a[y] = x;
  if (S.count(TT{arr, x, y})) return;
  S.insert(TT{arr, x, y});
  bool vis[15] = {};
  for (int i = (1); i <= (n); i++)
    if (arr.a[i]) vis[i] = vis[arr.a[i]] = 1;
  if (*min_element(vis + 1, vis + n + 1)) {
    if (E[x][y]) S1.insert(arr);
    return;
  }
  for (int i = (1); i <= (n); i++)
    if (E[x][i] && !vis[i])
      for (int j = (1); j <= (n); j++)
        if (E[y][j] && !vis[j] && i ^ j) dfs(arr, i, j);
}
inline void work(T arr, int i) {
  while (i <= n && arr.a[i]) i++;
  if (i > n) {
    for (int i = (1); i <= (n); i++)
      if (arr.a[arr.a[i]]) arr.a[i] = arr.a[arr.a[i]];
    return S2.insert(arr), void();
  }
  vector<int> v;
  for (int j = (i + 1); j <= (n); j++)
    if (!arr.a[j]) v.push_back(j);
  for (int j = (0); j <= ((1 << ((int)v.size())) - 1); j++) {
    T tmp = arr;
    for (int k = (0); k <= (((int)v.size()) - 1); k++)
      if ((j >> k) & 1) tmp.a[v[k]] = i;
    work(tmp, i + 1);
  }
}
int main() {
  n = read(), m = read(), k = read();
  for (int i = (1); i <= (m); i++) {
    int x = read(), y = read();
    E[x][y] = E[y][x] = 1;
  }
  for (int i = (1); i <= (n); i++)
    for (int j = (1); j <= (n); j++)
      if (i ^ j) dfs(T(), i, j);
  for (auto x : S1) work(x, 1);
  for (auto x : S2) {
    int c = 0;
    for (int i = (1); i <= (n); i++)
      if (!x.a[i]) c++;
    cnt[c]++;
  }
  long long t = 1, ans = 0;
  for (int i = (1); i <= (n / 2); i++) {
    t *= (k--);
    ans += cnt[i] * t;
  }
  printf("%lld", ans);
}
