#include <bits/stdc++.h>
using namespace std;
long long int n, m, k, x;
vector<vector<long long int> > g;
inline long long int add(long long int x, long long int y) {
  x = x + y;
  if (x >= 1000000007) {
    x -= 1000000007;
  }
  return x;
}
inline long long int subtract(long long int x, long long int y) {
  return (x - y + 1000000007) % 1000000007;
}
inline long long int multiply(long long int x, long long int y) {
  return (x * y) % 1000000007;
}
long long int dp[100010][3][12];
long long int a[3][12], b[3][12];
void dfs(long long int curr, long long int par) {
  bool isleaf = true;
  for (auto child : g[curr]) {
    if (child == par) {
      continue;
    }
    isleaf = false;
    dfs(child, curr);
  }
  if (isleaf) {
    dp[curr][0][0] = k - 1;
    dp[curr][1][1] = 1;
    dp[curr][2][0] = m - k;
    return;
  }
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j <= x; j++) {
      a[i][j] = b[i][j] = 0LL;
    }
  }
  for (int i = 0; i < 3; i++) {
    a[i][0] = 1;
  }
  for (auto child : g[curr]) {
    if (child == par) {
      continue;
    }
    for (int type = 0; type < 3; type++) {
      for (int l = 0; l <= x; l++) {
        for (int r = 0; r <= x; r++) {
          if (l + r > x) {
            continue;
          }
          if (type == 0) {
            long long int temp = add(dp[child][0][r], dp[child][1][r]);
            temp = add(temp, dp[child][2][r]);
            b[type][l + r] = add(b[type][l + r], multiply(a[type][l], temp));
          } else if (type == 1) {
            b[type][l + r] =
                add(b[type][l + r], multiply(a[type][l], dp[child][0][r]));
          } else {
            long long int temp = add(dp[child][0][r], dp[child][2][r]);
            b[type][l + r] = add(b[type][l + r], multiply(a[type][l], temp));
          }
        }
      }
    }
    for (int type = 0; type < 3; type++) {
      for (int security = 0; security <= x; security++) {
        a[type][security] = b[type][security];
        b[type][security] = 0LL;
      }
    }
  }
  for (int security = 0; security <= x; security++) {
    dp[curr][0][security] = multiply(a[0][security], (k - 1));
    if (security >= 1) {
      dp[curr][1][security] = a[1][security - 1];
    }
    dp[curr][2][security] = multiply(a[2][security], (m - k));
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  long long int u, v;
  g.resize(n + 1);
  for (long long int i = 1; i <= n - 1; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  cin >> k >> x;
  dfs(1, 0);
  long long int ans = 0LL;
  for (int type = 0; type < 3; type++) {
    for (int security = 0; security <= x; security++) {
      ans = add(ans, dp[1][type][security]);
    }
  }
  cout << ans << endl;
  return 0;
}
