#include <bits/stdc++.h>
using namespace std;
const int maxN = 10 + 2;
bool adj[maxN][maxN];
int n, e, k;
int bit_one[1 << 10];
int bit[1 << 10][maxN];
int dp[1 << 10][1 << 10];
inline int setBit(int v) {
  int tmp = v;
  for (int i = 1; i <= n; i++) {
    bit[v][i] = tmp & 1;
    tmp = (tmp >> 1);
  }
  int ret = 0;
  for (int i = 1; i <= n; i++) ret += bit[v][i];
  return ret;
}
int main() {
  cin >> n >> e >> k;
  for (int i = 1; i <= e; i++) {
    int e1, e2;
    cin >> e1 >> e2;
    adj[e1][e2] = adj[e2][e1] = true;
  }
  for (int i = 0; i < (1 << n); i++) bit_one[i] = setBit(i);
  for (int i = 1, leni = (1 << n); i < leni; i++) {
    if (bit_one[i] == 1) continue;
    if (bit_one[i] == 2) {
      int e1 = -1, e2 = -1;
      for (int j = 1; j <= n; j++)
        if (bit[i][j]) {
          if (e1 == -1)
            e1 = j;
          else
            e2 = j;
        }
      dp[i][i] = adj[e1][e2];
      continue;
    }
    for (int j = 1; j < leni; j++) {
      if (bit_one[j] > 1 && bit_one[j] < bit_one[i] && (i & j) == j) {
        int z = (i ^ j);
        int poi = 0;
        while ((j & (1 << poi)) == 0) poi++;
        int ii = (i ^ (1 << poi)), jj = (j ^ (1 << poi));
        for (int t = 1; t <= n; t++)
          if (bit[z][t] && adj[poi + 1][t])
            dp[i][j] += dp[ii][jj] + dp[ii][jj | (1 << (t - 1))];
      }
    }
  }
  int res = 0;
  for (int i = 1; i < (1 << n); i++)
    if (bit_one[i] == k) res += dp[(1 << n) - 1][i];
  cout << res << endl;
  return 0;
}
