#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 100000;
vector<vector<long long> > data;
long long K = 1000000007;
long long dp[MAXN][11][3];
long long n, m, k, x, ai, bi;
void dfs(long long vertex, long long last) {
  dp[vertex][0][0] = k - 1;
  dp[vertex][1][1] = 1;
  dp[vertex][0][2] = m - k;
  for (long long i = 0; i < data[vertex].size(); i++) {
    long long to = data[vertex][i];
    if (to == last) continue;
    dfs(to, vertex);
    for (long long j = 10; j >= 0; j--) {
      for (long long p = 1; p + j <= 10; p++) {
        dp[vertex][p + j][0] +=
            (dp[to][p][0] + dp[to][p][1] + dp[to][p][2]) * dp[vertex][j][0];
        dp[vertex][p + j][0] %= K;
      }
      dp[vertex][j][0] *= (dp[to][0][0] + dp[to][0][1] + dp[to][0][2]);
      dp[vertex][j][0] %= K;
    }
    for (long long j = 10; j >= 0; j--) {
      for (long long p = 1; p + j <= 10; p++) {
        dp[vertex][p + j][1] += (dp[to][p][0]) * dp[vertex][j][1];
        dp[vertex][p + j][1] %= K;
      }
      dp[vertex][j][1] *= (dp[to][0][0]);
      dp[vertex][j][1] %= K;
    }
    for (long long j = 10; j >= 0; j--) {
      for (long long p = 1; p + j <= 10; p++) {
        dp[vertex][p + j][2] +=
            (dp[to][p][0] + dp[to][p][2]) * dp[vertex][j][2];
        dp[vertex][p + j][2] %= K;
      }
      dp[vertex][j][2] *= (dp[to][0][0] + dp[to][0][2]);
      dp[vertex][j][2] %= K;
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    vector<long long> help;
    data.push_back(help);
    for (long long j = 0; j <= 10; j++) {
      dp[i][j][0] = 0;
      dp[i][j][1] = 0;
      dp[i][j][2] = 0;
    }
  }
  for (long long i = 0; i < n - 1; i++) {
    cin >> ai >> bi;
    data[ai - 1].push_back(bi - 1);
    data[bi - 1].push_back(ai - 1);
  }
  cin >> k >> x;
  dfs(0, -1);
  long long ans = 0;
  for (long long i = 0; i <= x; i++) {
    for (long long j = 0; j < 3; j++) {
      ans += dp[0][i][j];
    }
  }
  cout << ans % K << endl;
  return 0;
}
