template <classT> istream& operator>>(istream& is, vec<T>& V) { for (auto& x : V) is >> x; return is; }
constexprint Mod = 998'244'353;
voidmad(int& x, int y){ x += y - Mod; x += Mod & (x >> 31); }
intmain(){ cin.tie(nullptr)->sync_with_stdio(false); int n, m, k; cin >> n >> m >> k; vec<int> dp_arr(n), dp_aux(m); int offset{}; auto dp = [&](int i) -> int& { i += offset - n; i += n & (i >> 31); return dp_arr[i]; }; vec<pair<int, int>> edges(m); for (auto& [x, y] : edges) { cin >> x >> y; --x, --y; } dp_arr[0] = 1; for (int t = 1; t <= k; t++) { for (int i = 0; i < m; i++) { auto [x, y] = edges[i]; dp_aux[i] = dp(x); } if (offset == 0) offset = n; offset -= 1; for (int i = 0; i < m; i++) { auto [x, y] = edges[i]; mad(dp(y), dp_aux[i]); } } cout << reduce(ALL(dp_arr), 0LL) % Mod << '\n'; }