inlineintqread(){ char c = getchar(); int x = 0, f = 1; while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); } while (c >= '0' && c <= '9') { x = (x << 3) + (x << 1) + c - 48; c = getchar(); } return x * f; }
constint N = 200005, K = 300005, M = 55, T = 505; constlonglong mod = 998244353;
int n, m, t, k, dct[N]; vector <int> gr[N]; longlong f[2][K * 2], g[T][M * T], s[K * 2];
inlinevoidRead(){ n = qread(); m = qread(); t = qread(); k = qread(); for (int i = 1;i < n;i++) { int u = qread(), v = qread(); gr[u].push_back(v); gr[v].push_back(u); } }
inlinevoidDfs(int u, int fa, int dep){ dct[dep]++; for (int v : gr[u]) { if (v != fa) Dfs(v, u, dep + 1); } }
inlinevoidPrefix(){ Dfs(1, -1, 0); for (int i = 1;i <= t;i++) dct[i] += dct[i - 1]; }
inlinevoidSolve(){ g[0][0] = 1; for (int i = 1;i <= t;i++) { s[0] = 0; for (int j = 1;j <= m * (i + 1) + 1;j++) s[j] = (s[j - 1] + g[i - 1][j - 1]) % mod; for (int j = 0;j <= m * i;j++) g[i][j] = (s[j + m + 1] - s[max(0, j - m)]) % mod; memset(f[i & 1], 0, sizeof(f[i & 1])); for (int j = 1;j <= m;j++) { // sum v = -j longlong w = s[m - j + 1]; for (int l = 1, r;l <= min(k, dct[i]);l = r + 1) { r = min(dct[i], k / (k / l)); if (k / l - j >= 0) f[i & 1][k / l - j] = (f[i & 1][k / l - j] + (r - l + 1) * w) % mod; } } s[0] = 0; for (int j = 1;j <= m * (i + 1) + 1 + k;j++) s[j] = (s[j - 1] + f[i - 1 & 1][j - 1]) % mod; for (int j = 0;j <= m * i + k;j++) f[i & 1][j] = (f[i & 1][j] + s[j + m + 1] - s[max(0, j - m)]) % mod; } longlong ans = 0; for (int j = 0;j <= m * t;j++) ans = (ans + g[t][j] * n) % mod; for (int j = 0;j <= k + m * t;j++) ans = (ans + f[t & 1][j]) % mod; cout << (ans % mod + mod) % mod << endl; }