#include <bits/stdc++.h>
using namespace std;
long long fpm(long long b, long long e, long long m) {
  long long t = 1;
  for (; e; e >>= 1, b = b * b % m) e & 1 ? t = t * b % m : 0;
  return t;
}
template <class T>
inline bool chkmin(T &a, T b) {
  return a > b ? a = b, true : false;
}
template <class T>
inline bool chkmax(T &a, T b) {
  return a < b ? a = b, true : false;
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class edge>
struct Graph {
  vector<vector<edge> > adj;
  Graph(int n) {
    adj.clear();
    adj.resize(n + 5);
  }
  Graph() { adj.clear(); }
  void resize(int n) { adj.resize(n + 5); }
  void adde(int s, edge e) { adj[s].push_back(e); }
  int deg(int v) { return adj[v].size(); }
  vector<edge> &operator[](int t) { return adj[t]; }
};
const int maxn = 11, maxS = 1 << 10 | 50;
int G[maxn][maxn];
int f[maxS][maxS];
int pop[maxS], ctz[maxS];
int ans, n, m, k;
int dp(int S, int T) {
  int &ret = f[S][T];
  if (ret != -1) return ret;
  if (pop[T] < 2) return 0;
  ret = 0;
  int v = ctz[T & -T];
  for (int y = S & ~T, u; u = ctz[y & -y], y; y &= y - 1)
    if (G[v][u])
      ret += dp(S ^ (1 << v), T ^ (1 << v)) +
             dp(S ^ (1 << v), (T ^ (1 << v)) | 1 << u);
  return ret;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m >> k;
  memset(f, -1, sizeof(f));
  for (int i = 1, s, t; i <= m; ++i)
    cin >> s >> t, --s, --t, ++G[s][t], ++G[t][s],
        f[1 << s | 1 << t][1 << s | 1 << t] = 1;
  for (int i = 1; i <= 1 << n; ++i)
    pop[i] = pop[i >> 1] + (i & 1), ctz[i] = i & 1 ? 0 : (ctz[i >> 1] + 1);
  int ans = 0;
  for (int i = 0; i < 1 << n; ++i)
    if (pop[i] == k) ans += dp((1 << n) - 1, i);
  cout << ans << endl;
  return 0;
}
