#include <bits/stdc++.h>
using namespace std;
const int S = (1 << 10);
long long ans, n, m, k, x, y, g[10][10], dp[S][S];
string bits(int x) {
  string res = "";
  for (int i = 0; i < n; i++) res += (char)((int)'0' + ((x & (1 << i)) > 0));
  reverse(res.begin(), res.end());
  return res;
}
int main() {
  cin >> n >> m >> k;
  for (int i = 0; i < m; i++) {
    cin >> x >> y;
    g[min(x, y) - 1][max(x, y) - 1]++;
  }
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      if (g[i][j]) dp[(1 << i) + (1 << j)][(1 << i) + (1 << j)] = 2;
  for (int i = 0; i < (1 << n); i++)
    for (int j = 0; j < (1 << n); j++)
      for (int e1 = 0; e1 < n; e1++)
        for (int e2 = e1 + 1; e2 < n; e2++)
          if (g[e1][e2])
            if (((i & (1 << e1)) > 0) ^ ((i & (1 << e2)) > 0)) {
              long long new_node = ((i & (1 << e1)) ? e2 : e1);
              long long del_node = ((i & (1 << e1)) ? e1 : e2);
              long long nodes = (i | (1 << new_node));
              long long leaves = (j | (1 << del_node)) ^ (1 << del_node);
              leaves |= (1 << new_node);
              dp[nodes][leaves] += (dp[i][j] / (max(1, __builtin_popcount(j))));
            }
  for (int i = 0; i < (1 << n); i++)
    if (__builtin_popcount(i) == k) ans += dp[(1 << n) - 1][i];
  cout << ans / k << endl;
  return 0;
}
