// cre: nnhzzz - Nguyen Ngoc Hung

#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <unordered_set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <cstring>
#include <unordered_map>
#include <cmath>
#include <cassert>

using namespace std;

typedef long long ll;

const ll MOD = 1e9+7;
const ll maxn = 1e5+7;

vector <int> G[105];
ll dp[105][maxn],pre[105][maxn],fre[105][maxn];
int n,m,p;
bool v[105];

void dfs(int u){
    v[u] = 1;
    for(int i = 1; i<=m; ++i){
        dp[u][i] = 1;
    }
    for(int i = 0; i<(int)G[u].size(); ++i){
        if(!v[G[u][i]]){
            int v = G[u][i];
            dfs(v);
            for(int j = 1; j<=m; ++j){
                if(p>0){
                    dp[u][j] = 1LL*dp[u][j]*(pre[v][max(j-p,0)]+fre[v][min(m+1,j+p)])%MOD;
                }else{
                    dp[u][j] = 1LL*dp[u][j]*pre[v][m]%MOD;
                }
            }
        }
    }
    for(int i = 1; i<=m; i++){
        pre[u][i] = (pre[u][i-1]+dp[u][i])%MOD;
    }
    for(int i = m; i>0; i--){
        fre[u][i] = (fre[u][i+1]+dp[u][i])%MOD;
    }
    v[u] = 0;
}

int main(){
    #define name "test"
    if(fopen(name".inp","r")){
        freopen(name".inp","r",stdin);
        freopen(name".out","w",stdout);
    }
    int t; cin >> t;
    while(t--){
        memset(G,0,sizeof(G));
        memset(pre,0,sizeof(pre));
        memset(fre,0,sizeof(fre));
        cin >> n >> m >> p;
        for(int i=1;i<n;++i){
            int u,v; cin >> u >> v;
            G[u].push_back(v);
            G[v].push_back(u);
        }
        dfs(1);
        cout << pre[1][m] << endl;
    }
    return 0;
}