#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
inline int add(int a, int b) {
  int ret = a + b;
  if (ret >= mod) ret -= mod;
  return ret;
}
inline int mult(int a, int b) { return ((long long)a * b % mod); }
int n, m, k, x;
vector<int> graf[N];
int dp[N][11][3];
int tmp[11][3];
void dfs(int node, int dad) {
  for (int i = (0); i < (x + 1); i++)
    for (int j = (0); j < (3); j++) dp[node][i][j] = 0;
  dp[node][0][0] = k - 1;
  dp[node][1][1] = 1;
  dp[node][0][2] = m - k;
  for (auto it : graf[node]) {
    if (it == dad) continue;
    dfs(it, node);
  }
  for (auto it : graf[node]) {
    if (it == dad) continue;
    for (int i = (0); i < (x + 1); i++)
      for (int j = (0); j < (3); j++) tmp[i][j] = 0;
    for (int i = (0); i < (x + 1); i++) {
      for (int j = (0); j < (x + 1); j++) {
        if (i + j > x) break;
        for (int t1 = (0); t1 < (3); t1++) {
          for (int t2 = (0); t2 < (3); t2++) {
            if ((t1 == 1 || t2 == 1) && (t1 + t2 != 1)) continue;
            tmp[i + j][t1] =
                add(tmp[i + j][t1], mult(dp[node][i][t1], dp[it][j][t2]));
          }
        }
      }
    }
    for (int i = (0); i < (x + 1); i++)
      for (int j = (0); j < (3); j++) dp[node][i][j] = tmp[i][j];
  }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = (0); i < (n - 1); i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    graf[u].push_back(v);
    graf[v].push_back(u);
  }
  scanf("%d %d", &k, &x);
  dfs(1, 0);
  int sol = 0;
  for (int i = (0); i < (3); i++)
    for (int j = (0); j < (x + 1); j++) sol = add(sol, dp[1][j][i]);
  printf("%d\n", sol);
  return 0;
}
