#include <bits/stdc++.h>
using namespace std;
const long double EPS = 1E-9;
const int INF = (int)1E9;
const long long INF64 = (long long)1E18;
const long double PI = 2 * acos(.0);
long long dp[1050][1050];
bool lookat[15][15];
int n, m, k, x, y;
int main() {
  ios_base::sync_with_stdio(0);
  for (int i = 0; i < (int)(15); i++)
    for (int j = 0; j < (int)(15); j++) lookat[i][j] = false;
  for (int i = 0; i < (int)(1050); i++)
    for (int j = 0; j < (int)(1050); j++) dp[i][j] = 0;
  cin >> n >> m >> k;
  for (int i = 0; i < (int)(m); i++) {
    cin >> x >> y;
    lookat[x][y] = lookat[y][x] = true;
  }
  for (int i = 0; i < (int)(n); i++) {
    for (int j = 0; j < (int)(i); j++) {
      int mask = 0;
      mask = ((mask | (1 << i)) | (mask | (1 << j)));
      if (lookat[i + 1][j + 1] == true) dp[mask][mask] = 2;
    }
  }
  int comb[11];
  for (int times = 2; times < (int)(n); times++) {
    for (int mask_node = 0; mask_node < (int)((1 << n)); mask_node++) {
      int node_bits = __builtin_popcount(mask_node);
      if (node_bits != times) continue;
      fill(comb, comb + 11, -1);
      int cont = 0;
      for (int i = 0; i < (int)(n); i++) {
        if (mask_node & (1 << i)) comb[cont++] = i;
      }
      for (int mask_ends = 0; mask_ends < (int)((1 << node_bits));
           mask_ends++) {
        int mask_rend = 0;
        for (int j = 0; j < (int)(node_bits); j++) {
          int consulta = ((mask_ends & (1 << j)) > 0);
          mask_rend = (mask_rend | (consulta << comb[j]));
        }
        int counting_rends = __builtin_popcount(mask_rend);
        if (counting_rends < 2) continue;
        for (int j = 0; j < (int)(n); j++) {
          if (mask_node & (1 << j)) continue;
          int mask_node_next = (mask_node | (1 << j));
          for (int k = 0; k < (int)(node_bits); k++) {
            if (lookat[comb[k] + 1][j + 1]) {
              int mask_rend_next = mask_rend;
              if (mask_rend & (1 << comb[k])) {
                mask_rend_next = (mask_rend_next & (~(1 << comb[k])));
                mask_rend_next = (mask_rend_next | (1 << j));
                dp[mask_node_next][mask_rend_next] +=
                    (dp[mask_node][mask_rend] / counting_rends);
              } else {
                mask_rend_next = (mask_rend_next | (1 << j));
                dp[mask_node_next][mask_rend_next] +=
                    (dp[mask_node][mask_rend] / counting_rends);
              }
            }
          }
        }
      }
    }
  }
  long long resp = 0;
  for (int i = 0; i < (int)((1 << n)); i++) {
    if (__builtin_popcount(i) != k) continue;
    resp += dp[(1 << n) - 1][i];
  }
  cout << resp / (k) << endl;
  return 0;
}
