10
4 108 114
5 30 155
8 193 197
9 71 169
2 163 166
8 120 144
8 22 151
4 21 166
2 46 127
8 38 51
 20
9 142 172
7 132 256
8 245 315
9 496 496
3 345 362
8 13 162
5 342 470
9 16 488
9 467 482
4 471 478
10 92 224
6 228 261
9 54 167
2 402 409
5 9 10
7 225 360
3 438 483
6 252 342
3 491 493
6 296 367
 1
8 1234567890123 123456789012345

0
3
0
1
3
0
5
16
9
1
 0
0
0
0
4
6
13
7
0
0
1
2
3
0
0
2
12
9
1
4
 774752389568

#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 7;
const int oo = 0x3f3f3f3f;
const long long linf = 1ll << 60;
const double dinf = 1e60;
template <typename T>
inline void scf(T &x) {
  bool f = 0;
  x = 0;
  char c = getchar();
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  if (c == '-') f = 1, c = getchar();
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  if (f) x = -x;
  return;
}
template <typename T1, typename T2>
void scf(T1 &x, T2 &y) {
  scf(x);
  return scf(y);
}
template <typename T1, typename T2, typename T3>
void scf(T1 &x, T2 &y, T3 &z) {
  scf(x);
  scf(y);
  return scf(z);
}
template <typename T1, typename T2, typename T3, typename T4>
void scf(T1 &x, T2 &y, T3 &z, T4 &w) {
  scf(x);
  scf(y);
  scf(z);
  return scf(w);
}
inline char mygetchar() {
  char c = getchar();
  while (c == ' ' || c == '\n') c = getchar();
  return c;
}
template <typename T>
inline bool chkmax(T &x, const T &y) {
  return y > x ? x = y, 1 : 0;
}
template <typename T>
inline bool chkmin(T &x, const T &y) {
  return y < x ? x = y, 1 : 0;
}
const int maxn = 1e5 + 100;
const int mod = 1e9 + 7;
int n, m, K, x;
vector<int> g[maxn];
int dp[maxn][11][3];
int pow_mod(int x, int n) {
  int y = 1;
  while (n) {
    if (n & 1) {
      y = 1ll * y * x % mod;
    }
    x = 1ll * x * x % mod;
    n >>= 1;
  }
  return y;
}
void combine(int v, int u) {
  static int ret[11][3], s[11][3];
  memset(ret, 0, sizeof ret);
  for (int sz = (0), _end_ = (x); sz <= _end_; ++sz) {
    s[sz][1] = dp[v][sz][0];
    s[sz][2] = (dp[v][sz][0] + dp[v][sz][2]) % mod;
    s[sz][0] = (s[sz][2] + dp[v][sz][1]) % mod;
  }
  for (int fu = 0, _end_ = (3); fu < _end_; ++fu) {
    for (int s1 = (0), _end_ = (x); s1 <= _end_; ++s1) {
      for (int s2 = (0), _end_ = (x - s1); s2 <= _end_; ++s2) {
        ret[s1 + s2][fu] =
            (1ll * dp[u][s1][fu] * s[s2][fu] + ret[s1 + s2][fu]) % mod;
      }
    }
  }
  memcpy(dp[u], ret, sizeof(ret));
  return;
}
void dfs(int u = 1, int par = 0) {
  dp[u][0][0] = K - 1;
  dp[u][1][1] = 1;
  dp[u][0][2] = m - K;
  for (int v : g[u]) {
    if (v != par) {
      dfs(v, u);
      combine(v, u);
    }
  }
  return;
}
int main() {
  scf(n, m);
  if (n == 1) {
    printf("%d\n", m);
    return 0;
  }
  for (int i = 0, _end_ = (n - 1); i < _end_; ++i) {
    int u, v;
    scf(u, v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  scf(K, x);
  if (K == 1) {
    printf("%d\n", pow_mod(m - 1, n));
    return 0;
  }
  dfs();
  int ans = 0;
  for (int i = (0), _end_ = (x); i <= _end_; ++i) {
    for (int j = 0, _end_ = (3); j < _end_; ++j) {
      (ans += dp[1][i][j]) %= mod;
    }
  }
  printf("%d\n", ans);
  return 0;
}
