#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while ((c = getchar()) == ' ')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
long long n, m, k, i, j, a[15][15], g[15][15], ans, mod = 1e9 + 7, x, y,
                                                    f[1555], cnt, mp[15];
long long qp(long long x, long long y) {
  if (y == 0) return 1;
  long long z = qp(x, y / 2);
  z = z * z % mod;
  if (y & 1) z = z * x % mod;
  return z;
}
long long solve(long long x) {
  if (f[x] != -1) return f[x];
  f[x] = 1;
  long long i, j, k;
  cnt = 0;
  memset(a, 0, sizeof(a));
  if ((0) <= (n - 1))
    for ((i) = (0); (i) <= (n - 1); (i)++) {
      if (!((x >> i) & 1)) {
        mp[i] = cnt++;
      }
    }
  if ((0) <= (n - 1))
    for ((i) = (0); (i) <= (n - 1); (i)++) {
      if (!((x >> i) & 1)) {
        if ((0) <= (n - 1))
          for ((j) = (0); (j) <= (n - 1); (j)++) {
            if (!((x >> j) & 1))
              if (g[i][j]) {
                a[mp[i]][mp[i]]++;
                a[mp[i]][mp[j]]--;
              }
          }
      }
    }
  cnt--;
  if ((0) <= (cnt - 1))
    for ((i) = (0); (i) <= (cnt - 1); (i)++) {
      if ((i) <= (cnt - 1))
        for ((j) = (i); (j) <= (cnt - 1); (j)++) {
          if (a[i][i] == 0 && a[j][i] != 0) {
            if ((0) <= (cnt - 1))
              for ((k) = (0); (k) <= (cnt - 1); (k)++) {
                swap(a[i][k], a[j][k]);
              }
            f[x] *= -1;
          }
        }
      if (!a[i][i]) return f[x] = 0;
      if ((i + 1) <= (cnt - 1))
        for ((j) = (i + 1); (j) <= (cnt - 1); (j)++) {
          long long t = a[j][i] * qp(a[i][i], mod - 2) % mod;
          if ((0) <= (cnt - 1))
            for ((k) = (0); (k) <= (cnt - 1); (k)++) {
              (a[j][k] -= a[i][k] * t) %= mod;
            }
        }
    }
  if ((0) <= (cnt - 1))
    for ((i) = (0); (i) <= (cnt - 1); (i)++) (f[x] *= a[i][i]) %= mod;
  (f[x] += mod) %= mod;
  return f[x];
}
long long solve2(long long x) {
  long long s = 1, i, j;
  if (x == 3) {
    long long a;
    a++;
  }
  if ((0) <= (n - 1))
    for ((i) = (0); (i) <= (n - 1); (i)++)
      if (((x >> i) & 1)) {
        long long t = 0;
        if ((0) <= (n - 1))
          for ((j) = (0); (j) <= (n - 1); (j)++)
            if (!((x >> j) & 1)) {
              if (g[i][j]) t++;
            }
        s = s * t % mod;
      }
  return s * solve(x);
}
int main() {
  read(n);
  read(m);
  read(k);
  if ((1) <= ((m)))
    for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
      read(x);
      x--;
      read(y);
      y--;
      g[x][y] = g[y][x] = 1;
    }
  memset(f, -1, sizeof(f));
  for (i = 0; i < (1 << n); i++) {
    if (__builtin_popcount(i) == k) {
      for (j = (((1 << n) - 1) ^ i);; j = ((j - 1) & (((1 << n) - 1) ^ i))) {
        if (__builtin_popcount(j) & 1)
          ans -= solve2(i | j);
        else
          ans += solve2(i | j);
        if (!j) break;
      }
    }
  }
  cout << ans << endl;
  return 0;
}
