#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0;
  char ch = getchar();
  bool positive = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') positive = 0;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(long long a) {
  if (a >= 10) write(a / 10);
  putchar('0' + a % 10);
}
inline void writeln(long long a) {
  write(a);
  puts("");
}
const long long N = 200005, mod = 1000000007;
long long n, s, nextt[N << 1], son[N], ed[N << 1], nedge, x, m, k, ans;
long long dp[N][11][3];
inline void aedge(long long a, long long b) {
  nextt[++nedge] = son[a];
  son[a] = nedge;
  ed[nedge] = b;
}
inline void dfs(long long p, long long fa) {
  dp[p][0][0] = k - 1;
  dp[p][1][1] = 1;
  dp[p][0][2] = m - k;
  for (long long i = son[p]; i; i = nextt[i])
    if (ed[i] != fa) {
      dfs(ed[i], p);
      for (long long j = x; j >= 0; j--) {
        dp[p][j][0] = dp[p][j][0] * (dp[ed[i]][0][0] + dp[ed[i]][0][2]) % mod;
        dp[p][j][1] = dp[p][j][1] * dp[ed[i]][0][0] % mod;
        dp[p][j][2] = dp[p][j][2] * (dp[ed[i]][0][0] + dp[ed[i]][0][2]) % mod;
        for (long long l = 1; l <= j; l++) {
          dp[p][j][0] +=
              dp[p][j - l][0] *
              ((dp[ed[i]][l][0] + dp[ed[i]][l][1] + dp[ed[i]][l][2]) % mod) %
              mod;
          dp[p][j][2] += dp[p][j - l][2] *
                         ((dp[ed[i]][l][0] + dp[ed[i]][l][2]) % mod) % mod;
          dp[p][j][1] += dp[p][j - l][1] * dp[ed[i]][l][0];
          for (long long ll = 0; ll < 3; ll++) dp[p][j][ll] %= mod;
        }
      }
    }
}
int main() {
  n = read();
  m = read();
  for (long long i = 1; i < n; i++) {
    long long t1 = read(), t2 = read();
    aedge(t1, t2);
    aedge(t2, t1);
  }
  k = read();
  x = read();
  dfs(1, 0);
  for (long long i = 0; i <= x; i++)
    for (long long j = 0; j < 3; j++) ans = (ans + dp[1][i][j]) % mod;
  writeln(ans);
}
