#include <bits/stdc++.h>
using namespace std;
long long modpow(long long base, long long exponent, long long modulus) {
  if (base == 0 && exponent == 0) return 0;
  long long result = 1;
  while (exponent > 0) {
    if (exponent % 2 == 1) result = (result * base) % modulus;
    exponent = exponent >> 1;
    base = (base * base) % modulus;
  }
  return result;
}
int N;
long long M, X, K;
long long dp[200010][3][11];
vector<int> AdjList[200010], tree[200010];
vector<int> EdgeNo[200010];
int cnt = 0;
void dfs(int node, int dad) {
  EdgeNo[node].push_back(++cnt);
  tree[node].push_back(node);
  for (int i = 0; i < AdjList[node].size(); i++) {
    int v = AdjList[node][i];
    if (v != dad) {
      EdgeNo[node].push_back(++cnt);
      tree[node].push_back(v);
      dfs(v, node);
    }
  }
}
long long fn(int node, int childno, int color, int k) {
  int edge = EdgeNo[node][childno];
  if (dp[edge][color][k] != -1) return dp[edge][color][k];
  long long &ret = dp[edge][color][k];
  ret = 0;
  if (childno == 0) {
    if (k == 1 and color == 0) ret = 1;
    if (k == 0) {
      if (color == 1)
        ret = K - 1;
      else if (color == 2)
        ret = M - K;
    }
    return ret;
  }
  int v = tree[node][childno];
  int u = tree[v].size() - 1;
  if (color == 0) {
    if (k == 0) {
      return ret;
    } else {
      for (int p1 = 0; p1 <= k; p1++) {
        ret += (fn(node, childno - 1, color, p1) * fn(v, u, 1, k - p1)) %
               1000000007;
        if (ret >= 1000000007) ret -= 1000000007;
      }
      return ret;
    }
  } else if (color == 1) {
    for (int p1 = 0; p1 <= k; p1++) {
      long long o =
          (fn(v, u, 0, k - p1) + fn(v, u, 1, k - p1) + fn(v, u, 2, k - p1));
      ret += (fn(node, childno - 1, color, p1) * o) % 1000000007;
      if (ret >= 1000000007) ret -= 1000000007;
    }
    return ret;
  } else if (color == 2) {
    for (int p1 = 0; p1 <= k; p1++) {
      long long o = (fn(v, u, 1, k - p1) + fn(v, u, 2, k - p1));
      ret += (fn(node, childno - 1, color, p1) * o) % 1000000007;
      if (ret >= 1000000007) ret -= 1000000007;
    }
    return ret;
  }
}
inline void ReadInput(void) {
  scanf("%d", &N);
  scanf("%lld", &M);
  for (int i = 1; i < N; i++) {
    int a, b;
    scanf("%d", &a);
    scanf("%d", &b);
    AdjList[a].push_back(b);
    AdjList[b].push_back(a);
  }
  scanf("%lld", &K);
  scanf("%lld", &X);
}
inline void solve(void) {
  if (N == 1) {
    cout << M << endl;
  } else {
    dfs(1, 1);
    memset(dp, -1, sizeof(dp));
    long long ans = 0;
    for (int i = 0; i <= X; i++) {
      ans += fn(1, tree[1].size() - 1, 0, i);
      ans += fn(1, tree[1].size() - 1, 1, i);
      ans += fn(1, tree[1].size() - 1, 2, i);
      ans %= 1000000007;
    }
    cout << ans << endl;
  }
}
inline void Refresh(void) {}
int main() {
  ReadInput();
  solve();
  return 0;
}
