#include // #include "testlib.h" using namespace std ; #define ft first #define sd second #define pb push_back #define all(x) x.begin(),x.end() #define ll long long int #define vi vector #define vii vector > #define pii pair #define plii pair, int> #define piii pair #define viii vector > #define vl vector #define vll vector > #define pll pair #define pli pair #define mp make_pair #define ms(x, v) memset(x, v, sizeof x) #define sc1(x) scanf("%d",&x) #define sc2(x,y) scanf("%d%d",&x,&y) #define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define scll1(x) scanf("%lld",&x) #define scll2(x,y) scanf("%lld%lld",&x,&y) #define scll3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z) #define pr1(x) printf("%d\n",x) #define pr2(x,y) printf("%d %d\n",x,y) #define pr3(x,y,z) printf("%d %d %d\n",x,y,z) #define prll1(x) printf("%lld\n",x) #define prll2(x,y) printf("%lld %lld\n",x,y) #define prll3(x,y,z) printf("%lld %lld %lld\n",x,y,z) #define pr_vec(v) for(int i=0;i=b; i--) #define ASST(x, l, r) assert( x <= r && x >= l ) #include #include const int mod = 1e9 + 7; int ADD(int a, int b, int m = mod) { int s = a; s += b; if( s >= m ) s -= m; return s; } int MUL(int a, int b, int m = mod) { return (1LL * a * b % m); } int power(int a, int b, int m = mod) { int res = 1; while( b ) { if( b & 1 ) { res = 1LL * res * a % m; } a = 1LL * a * a % m; b /= 2; } return res; } ll nC2(ll x) { return ( x * ( x - 1 ) / 2 ); } const int maxn = 100 + 5; const int maxm = 20000 + 10; int dp[ maxn ][ maxm ]; int n, m, k; vi adj[ maxn ]; void netural(int &x) { if( x >= mod ) x -= mod; if( x < 0 ) x += mod; } void brute(int u, int p = 0) { for( auto it: adj[u] ) if( it != p ) brute( it, u ); int i; fr(i, 1, m) dp[u][i] = 1; fr(i, 1, m) { for( auto it: adj[u] ) { if( it != p ) { int val = 0; val += dp[it][max(0, i - k)]; netural( val ); if( i + k <= m ) { val += (dp[it][m] - dp[it][i+k-1]); netural( val ); } if( k == 0 ) { val -= dp[it][i] - dp[it][i-1]; netural( val ); } dp[u][i] = 1LL * val * dp[u][i] % mod; } } dp[u][i] += dp[u][i-1]; netural( dp[u][i] ); } } const int L1 = 19801; const int L2 = 9900; int val; void left(int i, int u, int it) { int cnt, v; cnt = max(0, i - k); if( cnt == 0 ) return; if( cnt <= L2 ) { val += dp[it][cnt]; } else { val += dp[it][L2]; netural( val ); cnt -= L2; v = dp[it][L2+1] - dp[it][L2]; netural( v ); if( cnt <= m - 2 * L2) { val += 1LL * cnt * v % mod; } else { val += 1LL * (m - 2 * L2) * v % mod; netural( val ); cnt -= (m - 2 * L2); val += dp[it][L2+1+cnt] - dp[it][L2+1]; } } netural( val ); } void right(int i, int u, int it) { int cnt, v; cnt = max(0, m - (i+k) + 1); if( cnt == 0 ) return; if( cnt <= L2 ) { val += dp[it][L1] - dp[it][L1-cnt]; } else { val += dp[it][L1] - dp[it][L1-L2]; netural( val ); cnt -= L2; v = dp[it][L2+1] - dp[it][L2]; netural( v ); if( cnt <= m - 2 * L2 ) val += 1LL * cnt * v % mod; else { val += 1LL * (m - 2 * L2) * v % mod; netural( val ); cnt -= (m - 2 * L2); val += dp[it][L2] - dp[it][L2-cnt]; } } netural( val ); } void optimise(int u, int p = 0) { for( auto it: adj[u] ) if( it != p ) optimise( it, u ); int i, j; fr(j, 1, L1) dp[u][j] = 1; fr(j, 1, L1) { if( j > L2+1 ) i = m - (L1 - j); else i = j; for( auto it: adj[u] ) { if( it != p ) { val = 0; left(i, u, it); right(i, u, it); if( k == 0 ) { val -= dp[it][j] - dp[it][j-1]; netural( val ); } dp[u][j] = 1LL * dp[u][j] * val % mod; } } dp[u][j] += dp[u][j-1]; netural( dp[u][j] ); } } void solve() { cin >> n >> m >> k; int i, j; fr(i, 1, n-1) { int u, v; cin >> u >> v; adj[u].pb( v ); adj[v].pb( u ); } if(m >= L1) { optimise( 1, 0 ); int ans = 0, v; ans += dp[1][L2]; netural( ans ); v = dp[1][L2+1] - dp[1][L2]; netural( v ); ans += 1LL * (m - 2 * L2) * v % mod; netural( ans ); ans += dp[1][L1] - dp[1][L1-L2]; netural( ans ); cout << ans << "\n"; } else { brute( 1, 0 ); cout << dp[1][m] << "\n"; } fr(i, 1, n) { fr(j, 1, min(m, 19801)) dp[i][j] = 0; adj[i].clear(); } } int main() { int t; cin >> t; while( t-- ) solve(); return 0; }