#include <bits/stdc++.h>
using namespace std;
const long long NMax = 100005;
const long long XMax = 12;
const long long mod = 1000000007;
long long n, m, x, y, k;
vector<long long> G[NMax];
long long viz[NMax], tmp[4][20];
long long dp[NMax][XMax][3];
void dfs(long long node) {
  viz[node] = 1;
  dp[node][0][0] = k - 1;
  dp[node][1][1] = 1;
  dp[node][0][2] = m - k;
  for (long long i = 0; i < G[node].size(); ++i) {
    if (!viz[G[node][i]]) {
      dfs(G[node][i]);
      for (long long j = 0; j <= 2; ++j) {
        for (long long l = 0; l <= x; ++l) {
          tmp[j][l] = 0;
        }
      }
      for (long long j = 0; j <= x; ++j) {
        for (long long l = 0; j + l <= x; ++l) {
          tmp[0][j + l] =
              (tmp[0][j + l] +
               dp[node][j][0] * (dp[G[node][i]][l][0] + dp[G[node][i]][l][1] +
                                 dp[G[node][i]][l][2])) %
              mod;
          tmp[1][j + l] =
              (tmp[1][j + l] + dp[node][j][1] * (dp[G[node][i]][l][0])) % mod;
          tmp[2][j + l] =
              (tmp[2][j + l] +
               dp[node][j][2] * (dp[G[node][i]][l][0] + dp[G[node][i]][l][2])) %
              mod;
        }
      }
      for (long long j = 0; j <= 2; ++j) {
        for (long long l = 0; l <= x; ++l) {
          dp[node][l][j] = tmp[j][l];
        }
      }
    }
  }
}
int main() {
  cin >> n >> m;
  for (long long i = 1; i < n; ++i) {
    cin >> x >> y;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  cin >> k >> x;
  dfs(1);
  long long ans = 0;
  for (long long i = 0; i <= x; ++i) {
    ans += (dp[1][i][0] + dp[1][i][1] + dp[1][i][2]);
    ans %= mod;
  }
  cout << ans << '\n';
  return 0;
}
