#include <bits/stdc++.h>
using namespace std;
double START_TIME;
void exit() { exit(0); }
template <typename A, typename B>
ostream& operator<<(ostream& os, pair<A, B> p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> v) {
  for (int i = 0; i <= (int)v.size() - 1; i++) {
    os << v[i] << " ";
  }
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, set<T> t) {
  for (auto z : t) {
    os << z << " ";
  }
  return os;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, map<T1, T2> t) {
  cerr << endl;
  for (auto z : t) {
    os << "\t" << z.first << " -> " << z.second << endl;
  }
  return os;
}
const int MAX = 12;
int n, m, k;
int e[MAX][MAX];
int who[MAX];
int d[(1 << 6)][6];
bool bit(int m, int i) { return ((m >> i) & 1); }
bool canplace(int x0, int y0, int x1, int y1) {
  return ((e[x0][x1] && e[y0][y1]) || (e[x0][y1] && e[y0][x1]));
}
vector<vector<int>> norm(vector<vector<int>> v) {
  for (int i = 0; i <= (int)v.size() - 1; i++) {
    sort(v[i].begin(), v[i].end());
  }
  sort(v.begin(), v.end());
  return v;
}
set<vector<vector<int>>> t;
long long ans;
long long dp[MAX][MAX];
void rec2(vector<vector<int>> state) {
  if (t.find(state) != t.end()) {
    return;
  }
  t.insert(state);
  long long ways = dp[(int)state.size()][(int)state.size()];
  ans += ways;
  for (int i = 0; i <= (int)state.size() - 1; i++) {
    for (int j = i + 1; j <= (int)state.size() - 1; j++) {
      vector<vector<int>> newstate;
      for (int o = 0; o <= (int)state.size() - 1; o++) {
        if (o == i || o == j) continue;
        newstate.push_back(state[o]);
      }
      vector<int> vv = state[i];
      vv.insert(vv.end(), state[j].begin(), state[j].end());
      newstate.push_back(vv);
      newstate = norm(newstate);
      rec2(newstate);
    }
  }
}
void check() {
  vector<pair<int, int>> vp;
  for (int i = 0; i <= n - 1; i++) {
    if (who[i] < i) {
      vp.push_back(make_pair(who[i], i));
    }
  }
  memset(d, 0, sizeof(d));
  for (int i = 0; i <= n / 2 - 1; i++) {
    int x = vp[i].first;
    int y = vp[i].second;
    if (e[x][y]) {
      d[(1 << i)][i] = 1;
    }
  }
  for (int o = 1; o <= (1 << (n / 2)) - 1; o++) {
    for (int i = 0; i <= n / 2 - 1; i++) {
      if (d[o][i]) {
        int x0 = vp[i].first;
        int y0 = vp[i].second;
        for (int j = 0; j <= n / 2 - 1; j++) {
          if (bit(o, j)) continue;
          int x1 = vp[j].first;
          int y1 = vp[j].second;
          if (canplace(x0, y0, x1, y1)) {
            int o2 = o | (1 << j);
            int i2 = j;
            d[o2][i2] = 1;
          }
        }
      }
    }
  }
  bool any = false;
  for (int i = 0; i <= n / 2 - 1; i++)
    if (d[(1 << (n / 2)) - 1][i]) any = true;
  if (any) {
    vector<vector<int>> state;
    for (int i = 0; i <= (int)vp.size() - 1; i++) {
      vector<int> v;
      v.push_back(vp[i].first);
      v.push_back(vp[i].second);
      state.push_back(v);
    }
    state = norm(state);
    rec2(state);
  }
}
void rec0(int x) {
  if (x == n) {
    check();
    return;
  }
  if (who[x] != -1) {
    rec0(x + 1);
    return;
  }
  for (int i = 0; i <= n - 1; i++) {
    if (who[i] == -1 && x != i) {
      who[i] = x;
      who[x] = i;
      rec0(x + 1);
      who[i] = -1;
      who[x] = -1;
    }
  }
}
void precalc() {
  dp[0][0] = 1;
  for (int i = 0; i <= MAX - 2; i++) {
    for (int j = 0; j <= MAX - 2; j++) {
      if (dp[i][j] == 0) continue;
      dp[i + 1][j] += dp[i][j] * j;
      dp[i + 1][j + 1] += dp[i][j] * (k - j);
    }
  }
  memset(who, -1, sizeof(who));
  rec0(0);
  printf("%lld\n", ans);
}
void solve() { precalc(); }
int main() {
  scanf("%d %d %d", &n, &m, &k);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    x--, y--;
    e[x][y] = e[y][x] = 1;
  }
  solve();
  exit();
  return 0;
}
