#include <bits/stdc++.h>   using namespace std;   long long mod = (long long)1000000007;   int M, K;   int par[100000 + 5];   vector<int> adj[100000 + 5];   long long dp[100000 + 5][11][3];   struct bin_tree_type {     int le;     int ri;   };   bin_tree_type tree[100000 + 5];   long long exp(long long ret, int pow) {     if (pow == 0) {       return 1;     }     long long sav = 1;     while (pow ^ 1) {       if (pow & 1) {         sav *= ret;         sav %= mod;       }       pow >>= 1;       ret *= ret;       ret %= mod;     }     ret *= sav;     ret %= mod;     return ret;   }   long long inv(long long inp) { return exp(inp, mod - 2); }   void dfs_lcrs(int nod, int pt) {     int lastchild = -1;     par[nod] = pt;     for (int ke : adj[nod]) {       if (ke == pt) {         continue;       }       if (lastchild == -1) {         tree[nod].le = ke;       } else {         tree[lastchild].ri = ke;       }       dfs_lcrs(ke, nod);       lastchild = ke;     }   }   long long DP(int nod, int rem, int status) {     if (nod == 0) {       if (rem == 0) {         return 1;       } else {         return 0;       }     }     long long &ret = dp[nod][rem][status];     if (ret >= 0) {       return ret;     }     ret = 0;     if (rem && status != 2) {       if (status == 1) {         long long sumc = 0;         for (int i = 0; i <= rem - 1; i++) {           sumc += DP(tree[nod].le, i, 2) * DP(tree[nod].ri, rem - 1 - i, 1);           sumc %= mod;         }         ret += sumc;       } else {         long long mult;         if (nod != 1) {           mult = ((long long)(K - 1) * inv(M - 1)) % mod;         } else {           mult = 1;         }         long long sumc = 0;         for (int i = 0; i <= rem - 1; i++) {           sumc += DP(tree[nod].le, i, 2) * DP(tree[nod].ri, rem - 1 - i, 1);           sumc %= mod;         }         sumc *= mult;         sumc %= mod;         ret += sumc;       }     }     if (status == 0) {       long long mult = M - 1;       long long sumc = 0;       for (int i = 0; i <= rem; i++) {         sumc += DP(tree[nod].le, i, 0) * DP(tree[nod].ri, rem - i, 0);         sumc %= mod;       }       sumc *= mult;       sumc %= mod;       ret += sumc;     } else if (status == 1) {       long long mult = M - 1;       long long sumc = 0;       for (int i = 0; i <= rem; i++) {         sumc += DP(tree[nod].le, i, 0) * DP(tree[nod].ri, rem - i, 1);         sumc %= mod;       }       sumc *= mult;       sumc %= mod;       ret += sumc;     } else if (status == 2) {       long long mult = K - 1;       long long sumc = 0;       for (int i = 0; i <= rem; i++) {         sumc += DP(tree[nod].le, i, 1) * DP(tree[nod].ri, rem - i, 2);         sumc %= mod;       }       sumc *= mult;       sumc %= mod;       ret += sumc;     }     return ret;   }   int main() {     memset(dp, -1, sizeof(dp));     int N, a, b, X;     long long has = 0;     scanf( %d %d , &N, &M);     int edge = N - 1;     while (edge--) {       scanf( %d %d , &a, &b);       adj[a].push_back(b);       adj[b].push_back(a);     }     scanf( %d %d , &K, &X);     if (K == 1 && N > 1) {       printf( %lld n , exp(M - 1, N));       return 0;     }     dfs_lcrs(1, 1);     for (int i = X; i >= 0; i--) {       has += DP(1, i, 0);       has %= mod;     }     printf( %lld n , has);   }