#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
const int M = 1000000007;
int n, m, k, x;
int e, a[N], b[N], last[N], nxt[N];
vector<vector<int> > g;
bool seen[N];
void addEdge(int u, int v) {
  seen[u] = true;
  a[e] = u;
  b[e] = v;
  nxt[e] = last[u];
  last[u] = e++;
}
void DFS(int u, int p) {
  for (int i = 0; i < g[u].size(); ++i)
    if (g[u][i] != p) {
      addEdge(u, g[u][i]);
      DFS(g[u][i], u);
    }
}
int dp[N][11][3][2];
int calc(int e, int rem, char s, bool first) {
  if (e == -2) {
    if (rem > 1) return 0;
    if (rem == 1) {
      if (s == 1) return 1;
      return 0;
    }
    if (s == 0) return m - 1;
    if (s == 1) return m - 1;
    return k - 1;
  }
  if (e == -1) return rem ? 0 : 1;
  int &ret = dp[e][rem][s][first];
  if (ret != -1) return ret;
  ret = 0;
  if (first) {
    if (s == 0) {
      ret = (ret + (long long)(k - 1) * calc(e, rem, 1, false)) % M;
      ret = (ret + (long long)(m - k) * calc(e, rem, 0, false)) % M;
    }
    if (s == 1) {
      ret = (ret + calc(e, rem - 1, 2, false)) % M;
      ret = (ret + (long long)(k - 1) * calc(e, rem, 1, false)) % M;
      ret = (ret + (long long)(m - k) * calc(e, rem, 0, false)) % M;
    }
    if (s == 2) {
      ret = (ret + (k - 1) * (long long)calc(e, rem, 1, false)) % M;
    }
    return ret;
  }
  for (int take = 0; take <= rem; ++take)
    ret = (ret + calc(last[b[e]], take, s, true) *
                     (long long)calc(nxt[e], rem - take, s, false)) %
          M;
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  memset(last, -1, sizeof(last));
  g.resize(n);
  for (int i = 1, a, b; i < n; ++i) {
    scanf("%d%d", &a, &b);
    --a;
    --b;
    g[a].push_back(b);
    swap(a, b);
    g[a].push_back(b);
  }
  scanf("%d%d", &k, &x);
  DFS(0, -1);
  memset(dp, -1, sizeof(dp));
  for (int i = 0; i < n; ++i)
    if (!seen[i]) last[i] = -2;
  int res = 0;
  for (int i = 0; i <= x; ++i) res = (res + calc(last[0], i, 1, true)) % M;
  printf("%d\n", res);
  return 0;
}
