#include <bits/stdc++.h>
const long long md = 1e9 + 7;
const int Inf = 1e9;
const long long Inf64 = 1e18;
const long long MaxN = 1e5 + 10;
const long long LogN = 25;
const long long MaxM = 5e5 + 10;
const long double eps = 1e-7;
const long long dx[4] = {0, 1, 0, -1};
const long long dy[4] = {1, 0, -1, 0};
const long long ddx[4] = {1, 1, -1, -1};
const long long ddy[4] = {1, -1, 1, -1};
const long double Pi = acos(-1);
using namespace std;
template <typename T>
istream &operator>>(istream &in, pair<T, T> &a) {
  in >> a.first >> a.second;
  return in;
}
template <typename T>
ostream &operator<<(ostream &out, pair<T, T> a) {
  out << a.first << ' ' << a.second;
  return out;
}
template <typename T>
istream &operator>>(istream &in, vector<T> &Mt) {
  for (T &a : Mt) in >> a;
  return in;
}
template <typename T>
ostream &operator<<(ostream &out, vector<T> Mt) {
  for (int i = 0; i < Mt.size(); i++) {
    out << Mt[i];
    if (i != Mt.size()) out << ' ';
  }
  return out;
}
inline long long Mod(long long &a, long long m = md) {
  while (a >= m) a -= m;
  return a;
}
inline long long gcd(long long a, long long b) {
  while (a) {
    b %= a;
    swap(a, b);
  }
  return b;
}
inline long long gcdex(long long a, long long mod = md) {
  long long g = mod, r = a, x = 0, y = 1;
  while (r != 0) {
    long long q = g / r;
    g %= r;
    swap(g, r);
    x -= q * y;
    swap(x, y);
  }
  return x < 0 ? x + mod : x;
}
inline long long binpow(long long a, long long n, long long m = md) {
  long long res = 1;
  while (n) {
    if (n & 1) {
      res *= a;
      res %= m;
    }
    a *= a;
    a %= m;
    n >>= 1;
  }
  return res % md;
}
long long N, M, K, X;
vector<long long> Gr[MaxN];
long long dp[MaxN][3][11];
long long a[3][11], b[3][11];
void dfs(long long v, long long p = -1) {
  bool ls = true;
  for (long long to : Gr[v]) {
    if (to == p) continue;
    dfs(to, v);
    ls = false;
  }
  long long temp = 0;
  if (ls) {
    dp[v][0][0] = K - 1;
    dp[v][1][1] = 1;
    dp[v][2][0] = M - K;
    return;
  }
  memset(a, 0, sizeof(a));
  memset(b, 0, sizeof(b));
  a[0][0] = 1;
  a[1][0] = 1;
  a[2][0] = 1;
  for (long long to : Gr[v]) {
    if (to == p) continue;
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j <= X; j++) {
        for (int k = 0; k <= X; k++) {
          if (j + k > X) continue;
          if (i == 0) {
            temp = dp[to][0][j] + dp[to][1][j] + dp[to][2][j];
            temp %= md;
            b[i][j + k] += (temp * a[i][k]) % md;
            b[i][j + k] %= md;
          } else if (i == 1) {
            temp = dp[to][0][j];
            temp %= md;
            b[i][j + k] += (temp * a[i][k]) % md;
            b[i][j + k] %= md;
          } else {
            temp = dp[to][0][j] + dp[to][2][j];
            temp %= md;
            b[i][j + k] += (temp * a[i][k]) % md;
            b[i][j + k] %= md;
          }
        }
      }
    }
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j <= X; j++) {
        a[i][j] = b[i][j];
        b[i][j] = 0;
      }
    }
  }
  for (long long l = 0; l <= X; l++) {
    dp[v][0][l] = (a[0][l] * (K - 1)) % md;
    if (l >= 1) dp[v][1][l] = a[1][l - 1];
    dp[v][2][l] = (a[2][l] * (M - K)) % md;
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << fixed, cout.precision(20);
  {
    cin >> N >> M;
    for (int i = 0; i < N - 1; i++) {
      long long a, b;
      cin >> a >> b;
      a--;
      b--;
      Gr[a].push_back(b);
      Gr[b].push_back(a);
    }
    long long Ans = 0;
    cin >> K >> X;
    dfs(0, -1);
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 11; j++) {
        Ans += dp[0][i][j];
        Ans %= md;
      }
    }
    cout << Ans;
  }
END:
  return 0;
}
