#include #include #include #include #include using namespace std; void getint(int &x) { int ch = x = 0; while (!isdigit(ch = getchar())) ; for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0'; } const int N = 1e5 + 10; int T, n, k, c; int adj[N], nxt[N << 1], to[N << 1], ecnt, sz[N], cnt[N], fa[N]; bool b[N]; vector grp[N]; inline void addEdge(int f, int t) { ecnt++; nxt[ecnt] = adj[f]; adj[f] = ecnt; to[ecnt] = t; } void dfs(int x, int p) { sz[x] = 1; for (int e = adj[x]; e; e = nxt[e]) if (to[e] != p) dfs(to[x], fa[to[x]] = x), sz[x] += sz[to[e]]; cnt[sz[x]]++; if (sz[x] % k == 0) grp[sz[x]].push_back(x); } void prnt(int x, int p) { if (b[x]) return; b[x] = true, ++c; printf("%d", x); putchar(" \n"[c % k == 0]); for (int e = adj[x]; e; e = nxt[e]) if (to[e] != p) prnt(to[e], e); } int main() { getint(T); while (T--) { memset(adj, 0, sizeof(adj)); memset(nxt, 0, sizeof(nxt)); memset(to, 0, sizeof(to)); memset(sz, 0, sizeof(sz)); memset(cnt, 0, sizeof(cnt)); memset(fa, 0, sizeof(fa)); memset(b, 0, sizeof(b)); for (int i = 0; i <= n; i++) grp[i].clear(); ecnt = c = 0; getint(n), getint(k); for (int i = 1, a, b; i < n; i++) getint(a), getint(b), addEdge(a, b), addEdge(b, a); dfs(1, 0); int gcnt = 0; for (int i = k; i <= n; i += k) gcnt += cnt[i]; if (gcnt * k != n) puts("NO"); else { puts("YES"); for (int i = k; i <= n; i += k) for (int t = 0; t < grp[k].size(); t++) prnt(grp[k][t], fa[grp[k][t]]); } } return 0; }