#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;
int n, m;
int k, x;
vector<int> adj[N];
int l[N], nex[N];
int dp[N][11][4];
unsigned long long dfs(const int cur, const char xcur, const char parstate,
                       const int parnode) {
  if (xcur < 0) return 0;
  if (cur == -1 && xcur > 0) return 0;
  if (cur == -1) return 1;
  if (dp[cur][xcur][parstate] != -1) return dp[cur][xcur][parstate];
  int left = l[cur];
  unsigned long long ans = 0;
  for (int i = 0; i <= xcur; i++) {
    switch (parstate) {
      case 0:
        ans += (dfs(left, i, 0, cur) * (m - k) % MOD) *
                   (dfs(nex[cur], xcur - i, parstate, parnode)) +
               (dfs(left, i, 1, cur) * (k - 1) % MOD) *
                   (dfs(nex[cur], xcur - i, parstate, parnode));
        break;
      case 1:
        ans += (dfs(left, i, 0, cur) * (m - k) % MOD) *
                   (dfs(nex[cur], xcur - i, parstate, parnode)) +
               dfs(left, i - 1, 2, cur) *
                   dfs(nex[cur], xcur - i, parstate, parnode) +
               (dfs(left, i, 1, cur) * (k - 1) % MOD) *
                   (dfs(nex[cur], xcur - i, parstate, parnode));
        break;
      case 2:
        ans += (dfs(left, i, 1, cur) * (k - 1) % MOD) *
               (dfs(nex[cur], xcur - i, parstate, parnode));
        break;
      default:
        exit(-1);
    }
  }
  return dp[cur][xcur][parstate] = ans % MOD;
}
void calcNex(const int cur, const int par) {
  for (int i : adj[cur])
    if (i != par) {
      l[cur] = i;
      break;
    }
  int prev = -1;
  for (int i : adj[cur]) {
    if (i != par) {
      if (prev != -1) nex[prev] = i;
      prev = i;
      calcNex(i, cur);
    }
  }
}
inline char get(void) {
  static char buf[100000], *S = buf, *T = buf;
  if (S == T) {
    T = (S = buf) + fread(buf, 1, 100000, stdin);
    if (S == T) return EOF;
  }
  return *S++;
}
inline void read(int &x) {
  static char c;
  x = 0;
  for (c = get(); c < '0' || c > '9'; c = get())
    ;
  for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  memset(dp, -1, sizeof dp);
  memset(l, -1, sizeof l);
  memset(nex, -1, sizeof nex);
  read(n);
  read(m);
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    read(u);
    read(v);
    adj[u - 1].push_back(v - 1);
    adj[v - 1].push_back(u - 1);
  }
  read(k);
  read(x);
  calcNex(0, -1);
  unsigned long long ans = 0;
  for (int i = 0; i <= x; i++) ans += dfs(0, i, 1, -1);
  cout << ans % MOD << '\n';
  return 0;
}
