#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
long long n, m, k, ans = 0, dp[1040][1040];
bool ed[15][15];
long long dfs(long long mask1, long long mask2) {
  if (dp[mask1][mask2] != -1) {
    return dp[mask1][mask2];
  }
  long long i, j, pre1, pre2;
  if (__builtin_popcount(mask1) == 2) {
    for (i = 0; i < n; i++) {
      if (mask1 & (1 << i)) {
        pre1 = i;
      }
    }
    for (i = n - 1; i >= 0; i--) {
      if (mask1 & (1 << i)) {
        pre2 = i;
      }
    }
    if (mask2 == mask1 && ed[pre1][pre2]) {
      dp[mask1][mask2] = 1;
    } else {
      dp[mask1][mask2] = 0;
    }
    return dp[mask1][mask2];
  }
  dp[mask1][mask2] = 0;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (ed[i][j] && (mask1 & (1 << i)) && (mask1 & (1 << j))) {
        if (!(mask2 & (1 << j))) {
          continue;
        }
        if (mask2 & (1 << i)) {
          continue;
        }
        if ((1 << j) > ((mask2) & (-mask2))) {
          continue;
        }
        pre1 = mask1 ^ (1 << j);
        pre2 = (mask2 ^ (1 << j)) | (1 << i);
        dp[mask1][mask2] += dfs(pre1, pre2);
        pre2 = mask2 ^ (1 << j);
        dp[mask1][mask2] += dfs(pre1, pre2);
      }
    }
  }
  return dp[mask1][mask2];
}
int main() {
  long long i, j, x, y;
  scanf("%lld%lld%lld", &n, &m, &k);
  for (i = 0; i < m; i++) {
    scanf("%lld%lld", &x, &y);
    x--;
    y--;
    ed[x][y] = ed[y][x] = true;
  }
  memset(dp, -1, sizeof(dp));
  for (i = 0; i < (1 << n); i++) {
    if (__builtin_popcount(i) == k) {
      ans += dfs((1 << n) - 1, i);
    }
  }
  printf("%lld\n", ans);
  return 0;
}
