#include <bits/stdc++.h>
using namespace std;
const int N = 11;
int n, m, u, v, q, fo, answer, dp[1 << N][1 << N];
set<int> nei[N];
inline bool check(int a, int b) {
  for (int i = 0; i < N; i++) {
    if (!b) return false;
    if (!(a & (1 << i)) && (b & (1 << i))) return false;
  }
  return true;
}
int main() {
  cin >> n >> m >> q;
  dp[0][0] = 1;
  for (int i = 0; i < n; i++) dp[1 << i][1 << i] = 1;
  for (int i = 0; i < m; i++) {
    cin >> u >> v;
    u--, v--;
    nei[v].insert(u);
    nei[u].insert(v);
    dp[(1 << u) + (1 << v)][(1 << u) + (1 << v)] = 1;
  }
  for (int i = 0; i < (1 << n); i++) {
    if (__builtin_popcount(i) <= 2) continue;
    for (int j = 0; j < i; j++) {
      if (check(i, j)) {
        for (int k = N; k >= 0; k--) {
          if (j & (1 << k)) {
            fo = k;
            break;
          }
        }
        for (int k = 0; k < N; k++) {
          if (!(j & (1 << k)) && (i & (1 << k)) &&
              nei[fo].find(k) != nei[fo].end()) {
            dp[i][j] += dp[i ^ (1 << fo)][j ^ (1 << fo)];
            dp[i][j] += dp[i ^ (1 << fo)][j - (1 << fo) + (1 << k)];
          }
        }
      }
    }
  }
  for (int i = 0; i < (1 << n); i++) {
    answer += dp[(1 << n) - 1][i] * (__builtin_popcount(i) == q);
  }
  cout << answer;
  return 0;
}
