#include using namespace std; using ll = long long; const ll MOD = 998244353; int N, M, K; vector> adj; // 状態ベクトルを (K+1)-進数に変換 ll pack_state(const vector& keys) { ll res = 0; ll b = 1; for (int k : keys) { res += 1LL * k * b; b *= (K + 1); } return res; } // 整数状態をベクトルに戻す vector unpack_state(ll x) { vector res(N); ll s = x; ll b = K + 1; for (int i = 0; i < N; i++) { res[i] = s % b; s /= b; } return res; } ll tsp() { ll size = 1; for (int i = 0; i < N; i++) size *= (K + 1); vector> dp(size, vector(N, 0)); // 各都市をスタートに初期化 for (int i = 0; i < N; i++) { vector keys(N, 0); keys[i] = 1; dp[pack_state(keys)][i] = 1; } for (ll i = 0; i < size; i++) { vector cnts = unpack_state(i); for (int j = 0; j < N; j++) { // 最後に訪れた都市 if (cnts[j] == 0) continue; ll cur = dp[i][j]; if (cur == 0) continue; for (int to : adj[j]) { if (cnts[to] == K) continue; vector xs = cnts; xs[to] += 1; ll nk = pack_state(xs); dp[nk][to] += cur; if (dp[nk][to] >= MOD) dp[nk][to] -= MOD; } } } vector full(N, K); ll nk = pack_state(full); ll res = 0; for (int i = 0; i < N; i++) { res += dp[nk][i]; if (res >= MOD) res -= MOD; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> M >> K; adj.assign(N, {}); for (int i = 0; i < M; i++) { int u, v; cin >> u >> v; u--, v--; adj[u].push_back(v); adj[v].push_back(u); } cout << tsp() % MOD << "\n"; return 0; }