#ifndef NOSTDCPP
#include <bits/stdc++.h>
#else
#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <complex>
#include <cstring>
#include <cstdio>
#include <deque>
#include <exception>
#include <functional>
#include <iomanip>
#include <iostream>
#include <istream>
#include <iterator>
#include <list>
#include <map>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#endif
# ifdef Linux_System
# define getchar getchar_unlocked
# define putchar putchar_unlocked
# endif
# define RESET(_) memset(_, 0, sizeof(_))
# define RESET_(_, val) memset(_, val, sizeof(_))
# define fi first
# define se second
# define pb push_back
# define midf(x, y) ((x + y) >> 1)
# define DXA(_) ((_ << 1))
# define DXB(_) ((_ << 1) | 1)
# define next __Chtholly__
# define x1 __Mercury__
# define y1 __bbtl04__
# define index __ikooo__
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector <int> vi;
typedef set <int> si;
typedef pair <int, int> pii;
typedef long double ld;
const int MOD = 1e9 + 7;
const int maxn = 300009;
const int maxm = 300009;
const ll inf = 1e18;
const double pi = acos(-1.0);
const double eps = 1e-6;
ll myrand(ll mod){return ((ll)rand() << 32 ^ (ll)rand() << 16 ^ rand()) % mod;}
template <class T>
inline bool scan_d(T & ret)
{
char c;
int sgn;
if(c = getchar(), c == EOF)return false;
while(c != '-' && (c < '0' || c > '9'))c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while(c = getchar(), c >= '0' && c <= '9')
ret = ret * 10 + (c - '0');
ret *= sgn;
return true;
}
#ifdef Cpp11
template <class T, class ... Args>
inline bool scan_d(T & ret, Args & ... args)
{
scan_d(ret);
scan_d(args...);
}
#define cin.tie(0); cin.tie(nullptr);
#define cout.tie(0); cout.tie(nullptr);
#endif
inline bool scan_ch(char &ch)
{
if(ch = getchar(), ch == EOF)return false;
while(ch == ' ' || ch == '\n')ch = getchar();
return true;
}
template <class T>
inline void out_number(T x)
{
if(x < 0)
{
putchar('-');
out_number(- x);
return ;
}
if(x > 9)out_number(x / 10);
putchar(x % 10 + '0');
}
struct info
{
int id, deep;
info(int x, int y){id = x, deep = y;}
bool operator < (const info &b) const
{
return deep < b.deep;
}
};
int n, k, root;
int deep[maxn], fa[maxn];
bool v[maxn], leaf[maxn], colored[maxn];
vi g[maxn];
vector <info> leafs;
void init()
{
for(int i = 1; i <= n; ++ i) g[i].clear();
leafs.clear();
RESET(deep);
RESET(leaf);
RESET(fa);
RESET(colored);
}
void dfs1(int u, int d)
{
deep[u] = d;
leaf[u] = true;
for(int i = 0; i < g[u].size(); ++ i)
{
if(! deep[g[u][i]])
dfs1(g[u][i], d + 1), leaf[u] = false, fa[g[u][i]] = u;
}
}
void color(int p, int rm)
{
colored[p] = true;
if(rm == 0) return ;
for(int i = 0; i < g[p].size(); ++ i)
color(g[p][i], rm - 1);
}
int ans()
{
int result = 0, rp;
info tmp(0, 0);
color(root, k);
while(leafs.size())
{
tmp = *(-- leafs.end());
if(! colored[tmp.id])
{
rp = tmp.id;
for(int w = 1; w <= k; ++ w) rp = fa[rp];
color(rp, k);
++ result;
}
leafs.pop_back();
}
return result;
}
int main()
{
int T, f, t;
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
init();
scanf("%d %d", &root, &k);
for(int i = 1; i < n; ++ i)
{
scanf("%d %d", &f, &t);
g[t].push_back(f);
g[f].push_back(t);
}
dfs1(root, 1);
fa[root] = root;
for(int i = 1; i <= n; ++ i) if(leaf[i]) leafs.push_back(info(i, deep[i]));
sort(leafs.begin(), leafs.end());
printf("%d\n", ans());
}
return 0;
}