#include <bits/stdc++.h>
using namespace std;
const int N = 11, M = (1 << 10);
long long dp[M][M], n, m, k;
vector<int> ad[N];
bool has(int msk, int p) { return ((msk >> (p - 1)) & 1); }
int up(int msk, int p) { return (msk ^ (1 << (p - 1))); }
int sz(int msk) { return __builtin_popcount(msk); }
pair<int, int> ord[M * M];
int siz;
int main() {
  cin >> n >> m >> k;
  while (m--) {
    int v, u;
    cin >> v >> u;
    ad[v].push_back(u);
    ad[u].push_back(v);
  }
  for (int i = 1; i <= n; i++)
    for (auto v : ad[i])
      for (auto u : ad[i])
        if (v != u) dp[up(up(0, v), u)][up(0, i)] = 1;
  for (int msk = 0; msk < (1 << n); msk++)
    for (int tsk = 0; tsk < (1 << n); tsk++) {
      siz++;
      ord[siz].first = msk;
      ord[siz].second = tsk;
    }
  sort(ord + 1, ord + siz + 1, [](pair<int, int> x, pair<int, int> y) {
    return sz(x.first) + sz(x.second) < sz(y.first) + sz(y.second);
  });
  for (int i = 1; i <= siz; i++) {
    int msk = ord[i].first;
    int tsk = ord[i].second;
    if (sz(tsk) + sz(msk) <= 3) continue;
    int leaf = 0, bad = 0;
    for (int i = 1; i <= n; i++) {
      if (has(msk, i) && has(tsk, i)) bad = 1;
      if (has(msk, i)) leaf = i;
    }
    if (bad || !leaf) continue;
    for (auto v : ad[leaf])
      if (has(tsk, v))
        dp[msk][tsk] +=
            dp[up(msk, leaf)][tsk] + dp[up(up(msk, leaf), v)][up(tsk, v)];
  }
  int ans = 0;
  for (int msk = 0; msk < (1 << n); msk++)
    for (int tsk = 0; tsk < (1 << n); tsk++) {
      if (sz(msk) == k && sz(tsk) == n - k) ans += dp[msk][tsk];
    }
  cout << ans;
  return 0;
}
