#include <bits/stdc++.h>
#define int long long
#define inf INT_MAX
#define N 100005
#define mod 1000000007
using namespace std;
inline int r() {int x; cin >> x; return x;}
inline void w(int x) {cout << x << '\n';}
inline void W(int x) {cout << x << ' ';}
struct node {
int next, pointer;
} edge[N << 1];
int n, k, tot, cut;
int head[N];
int son[N];
int sz[N];
int tag[N];
inline void add(int u, int v) {
edge[++ tot].next = v,
edge[tot].pointer = head[u],
head[u] = tot;
}
inline void calc(int x, int f) {
son[x] = 1;
for (int i = head[x]; i; i = edge[i].pointer) if (edge[i].next != f) calc(edge[i].next, x), son[x] += son[edge[i].next];
}
inline void dfs(int f, int x, int siz) {
if (sz[x] < siz) return ;
for (int i = head[x]; i; i = edge[i].pointer) {
if (edge[i].next != f) dfs(x, edge[i].next, siz);
if (cut >= k) return ;
}
if (sz[x] - tag[x] >= siz && sz[1] - sz[x] + tag[x] >= siz) sz[1] -= sz[x], cut ++, tag[f] += sz[x];
tag[f] += tag[x];
}
inline bool check(int x) {
cut = 0;
for (int i = 1; i <= n; i ++) sz[i] = son[i], tag[i] = 0;
dfs(0, 1, x);
return cut >= k;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int t = r();
while (t --) {
tot = 0, n = r(), k = r();
int L = 0, R = N - 5;
for (int i = 1; i < n; i ++) {
int u = r(), v = r();
add(u, v), add(v, u);
}
calc(1, 0);
while (R - L > 1) {
int mid = L + R >> 1;
if (check(mid)) L = mid;
else R = mid;
}
w(L);
for (int i = 1; i <= n; i ++) head[i] = 0;
}
return 0;
}