#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline string get() {
  char ch[1001000];
  scanf("%s", ch);
  return ch;
}
template <class P, class Q>
inline P smin(P &a, Q b) {
  if (b < a) a = b;
  return a;
}
template <class P, class Q>
inline P smax(P &a, Q b) {
  if (a < b) a = b;
  return a;
}
const int maxn = 2048;
const int base = 29;
const int MAX_LG = 21;
const int mod = 1e9 + 7;
const int INF = 1e18;
const int maxq = 2e5 + 10;
bool e[maxn][maxn];
int n, m, k;
int Log[maxn], cnt[maxn];
int dp[maxn][maxn];
inline int calc(int a, int b) {
  if (max(a, b) >= (1 << n)) return 0;
  if (dp[a][b] != -1) return dp[a][b];
  if (cnt[a] == 2) {
    return (e[Log[a & -a]][Log[a - (a & -a)]] && a == b);
  }
  if (cnt[a] <= 1 || cnt[b] <= 1) return 0;
  dp[a][b] = 0;
  int p = Log[b & -b];
  int _b = b - (1 << p);
  int _a = a - (1 << p);
  for (int i = 0; i < n; i++) {
    int j = 1 << i;
    if ((j & a) && !(j & b) && e[i][p]) {
      dp[a][b] += calc(_a, _b) + calc(_a, _b + j);
    }
  }
  return dp[a][b];
}
int res;
int32_t main() {
  for (int i = 0; i < maxn; i++)
    for (int j = 0; j < maxn; j++) dp[i][j] = -1;
  n = in(), m = in(), k = in();
  for (int i = 0; i < m; i++) {
    int v = in() - 1, u = in() - 1;
    e[v][u] = e[u][v] = 1;
  }
  for (int i = 0; i <= 10; i++) Log[1 << i] = i;
  for (int i = 1; i < maxn; i++) cnt[i] = cnt[i ^ (i & -i)] + 1;
  for (int mask = 1; mask < (1 << n); mask++)
    if (cnt[mask] == k) res += calc((1 << n) - 1, mask);
  cout << res << endl;
}
