#include using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; #define f first #define s second #define pb push_back #define mp make_pair const int maxn = 1000500; const int inf = 1e9; const double eps = 1e-8; const int base = 1073676287; vector edge[maxn]; int used[maxn]; int dist[maxn]; int cur_deg[maxn]; set , int>> vertices; vector res; void Init(int n) { for (int i = 0; i <= n; ++i) { edge[i].clear(); used[i] = false; } vertices.clear(); res.clear(); } void dfs(int v, int h) { used[v] = true; dist[v] = h; for (auto to : edge[v]) if (!used[to]) dfs(to, h + 1); } void ClearVector(int v) { while (true) { if (edge[v].empty()) return; int x = edge[v][edge[v].size() - 1]; if (vertices.find(mp(mp(cur_deg[x], -dist[x]), x)) == vertices.end()) edge[v].pop_back(); else return; } } void Solve() { int n; scanf ("%d", &n); Init(n); for (int i = 1; i < n; ++i) { int u, v; scanf ("%d%d", &u, &v); edge[u].pb(v); edge[v].pb(u); } if ((n - 1) % 3) { printf ("NO\n"); return; } if (n == 1) { printf ("YES\n"); return; } dfs(1, 0); for (int i = 1; i <= n; ++i) { cur_deg[i] = edge[i].size(); vertices.insert(mp(mp(cur_deg[i], -dist[i]), i)); sort(edge[i].begin(), edge[i].end(), [] (const auto x, const auto y) {return dist[x] < dist[y];}); } while (!vertices.empty()) { auto x = *vertices.begin(); // cerr << x.f.f << ' ' << x.s << endl; vertices.erase(vertices.begin()); assert(x.f.f == 1); int b = x.s; ClearVector(b); assert(edge[b].size() == 1); int a = edge[b][0]; vertices.erase(mp(mp(cur_deg[a], -dist[a]), a)); ClearVector(a); if (edge[a].empty()) { printf ("NO\n"); return; } int c = edge[a][edge[a].size() - 1]; vertices.erase(mp(mp(cur_deg[c], -dist[c]), c)); ClearVector(a); if (edge[a].empty()) { printf ("NO\n"); return; } int d = edge[a][edge[a].size() - 1]; vertices.erase(mp(mp(cur_deg[d], -dist[d]), d)); cur_deg[a] -= 3; --cur_deg[b]; --cur_deg[c]; --cur_deg[d]; // cerr << a << ' ' << b << ' ' << c << ' ' << d << ' ' << cur_deg[a] << endl; assert(!cur_deg[b]); assert(!cur_deg[c]); if (cur_deg[a]) vertices.insert(mp(mp(cur_deg[a], -dist[a]), a)); if (cur_deg[d]) vertices.insert(mp(mp(cur_deg[d], -dist[d]), d)); res.pb(a); res.pb(b); res.pb(c); res.pb(d); } assert(res.size() % 4 == 0); printf ("YES\n"); for (int i = 0; i < res.size(); i += 4) printf ("%d %d %d %d\n", res[i], res[i + 1], res[i + 2], res[i + 3]); } int main() { srand(time(0)); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); // ifstream cin("input.txt"); // ofstream cout("output.txt"); // ios_base::sync_with_stdio(false); int q; scanf ("%d", &q); while (q--) Solve(); }