#include <bits/stdc++.h>
using namespace std;
vector<int> adj[int(1e5)];
int n, m, k, x;
tuple<int, int, int> memo[int(1e5)][11];
bool inMemo[int(1e5)];
tuple<int, int, int> calc(int node, int par, int availSV) {
  if (inMemo[node]) {
    return memo[node][availSV];
  }
  if (adj[node].size() == 0 || (adj[node].size() == 1 && adj[node][0] == par)) {
    for (int availSV = 0; availSV <= 10; ++availSV) {
      tuple<int, int, int> ret;
      if (availSV == 0) {
        get<2>(ret) = k - 1;
        get<0>(ret) = get<1>(ret) = m - 1;
      } else if (availSV == 1) {
        get<1>(ret) = 1;
        get<0>(ret) = get<2>(ret) = 0;
      }
      memo[node][availSV] = ret;
    }
    inMemo[node] = true;
    return memo[node][availSV];
  }
  long long dpDefault[11] = {0};
  long long dpClose[11] = {0};
  long long dpSV[11] = {0};
  long long dpDefaultPrev[11];
  long long dpClosePrev[11];
  long long dpSVPrev[11];
  bool first = true;
  for (int child : adj[node]) {
    if (child == par) {
      continue;
    }
    for (int used = 0; used <= 10; ++used) {
      for (int avail = 0; used + avail <= 10; ++avail) {
        if (!first) {
          dpSV[used + avail] +=
              get<2>(calc(child, node, avail)) * dpSVPrev[used];
        } else if (first && used == 0) {
          dpSV[used + avail] += get<2>(calc(child, node, avail));
        }
        dpSV[used + avail] %= int(1e9 + 7);
        if (!first) {
          dpClose[used + avail] +=
              get<1>(calc(child, node, avail)) * dpClosePrev[used];
        } else if (first && used == 0) {
          dpClose[used + avail] += get<1>(calc(child, node, avail));
        }
        dpClose[used + avail] %= int(1e9 + 7);
        if (!first) {
          dpDefault[used + avail] +=
              get<0>(calc(child, node, avail)) * dpDefaultPrev[used];
        } else if (first && used == 0) {
          dpDefault[used + avail] += get<0>(calc(child, node, avail));
        }
        dpDefault[used + avail] %= int(1e9 + 7);
      }
    }
    for (int i = 0; i <= 10; ++i) {
      dpDefaultPrev[i] = dpDefault[i];
      dpClosePrev[i] = dpClose[i];
      dpSVPrev[i] = dpSV[i];
      dpDefault[i] = 0;
      dpClose[i] = 0;
      dpSV[i] = 0;
    }
    first = false;
  }
  for (int availSV = 0; availSV <= 10; ++availSV) {
    tuple<int, int, int> ret;
    long long ifDefault = ((m - k) * dpDefaultPrev[availSV]) % int(1e9 + 7);
    long long ifClose = ((k - 1) * dpClosePrev[availSV]) % int(1e9 + 7);
    long long ifSV = (availSV > 0 ? dpSVPrev[availSV - 1] : 0) % int(1e9 + 7);
    get<0>(ret) = (ifDefault + ifClose) % int(1e9 + 7);
    get<1>(ret) = (ifDefault + ifClose + ifSV) % int(1e9 + 7);
    get<2>(ret) = (ifClose) % int(1e9 + 7);
    memo[node][availSV] = ret;
  }
  inMemo[node] = true;
  return memo[node][availSV];
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  cin >> k >> x;
  if (k == 1) {
    long long ans = 1;
    for (int i = 0; i < n; ++i) {
      ans *= m - 1;
      ans %= int(1e9 + 7);
    }
    if (x > 0 && n == 1) {
      ans++;
      ans %= int(1e9 + 7);
    }
    cout << ans;
    return 0;
  }
  int ans = 0;
  for (int i = 0; i <= x; ++i) {
    ans += get<1>(calc(0, -1, i));
    ans %= int(1e9 + 7);
  }
  cout << ans;
  return 0;
}
