Problem: Nastia has an unweighted tree with n vertices and wants to play with it!

The girl will perform the following operation with her tree, as long as she needs:

  1. Remove any existing edge. 
  2. Add an edge between any pair of vertices. 



What is the minimum number of operations Nastia needs to get a bamboo from a tree? A bamboo is a tree in which no node has a degree greater than 2.

Input

The first line contains a single integer t (1 ≤ t ≤ 10 000) — the number of test cases.

The first line of each test case contains a single integer n (2 ≤ n ≤ 10^5) — the number of vertices in the tree.

Next n - 1 lines of each test cases describe the edges of the tree in form a_i, b_i (1 ≤ a_i, b_i ≤ n, a_i ≠ b_i).

It's guaranteed the given graph is a tree and the sum of n in one test doesn't exceed 2 ⋅ 10^5.

Output

For each test case in the first line print a single integer k — the minimum number of operations required to obtain a bamboo from the initial tree.

In the next k lines print 4 integers x_1, y_1, x_2, y_2 (1 ≤ x_1, y_1, x_2, y_{2} ≤ n, x_1 ≠ y_1, x_2 ≠ y_2) — this way you remove the edge (x_1, y_1) and add an undirected edge (x_2, y_2).

Note that the edge (x_1, y_1) must be present in the graph at the moment of removing.

Example

Input


2
7
1 2
1 3
2 4
2 5
3 6
3 7
4
1 2
1 3
3 4


Output


2
2 5 6 7
3 6 4 5
0

Note

Note the graph can be unconnected after a certain operation.

Consider the first test case of the example: 

<image> The red edges are removed, and the green ones are added.

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;

const long N = 1e5 + 5;

typedef pair<long, long> ii;

struct ope
{
    long x, y, u, v;
};

vector<ope> operations;
long n, answer, deg[N];
vector<long> g[N];
bool isParent[N];
map<long, bool> isDeleted[N];
bool vis[N];
vector<ii> con;

void dfs(long u, long p)
{
    long nchild = 0;
    for (long v: g[u])
    {
        if (v == p) continue;
        dfs(v, u);
        if (!isParent[v]) nchild++;
    }
    if (nchild <= 1) return;
    if (nchild == 2)
    {
        if (u != p)
        {
            answer++;
            isDeleted[u][p] = true;
            isDeleted[p][u] = true;
            operations.push_back({u, p, 0, 0});
            isParent[u] = true;
        }
        return;
    }
    answer += nchild - 2;
    for (long v: g[u])
    {
        if (v == p || isParent[v]) continue;
        isDeleted[u][v] = true;
        isDeleted[v][u] = true;
        operations.push_back({u, v, 0, 0});
        nchild--;
        if (nchild == 2) break;
    }
    if (u != p)
    {
        answer++;
        isDeleted[u][p] = true;
        isDeleted[p][u] = true;
        operations.push_back({u, p, 0, 0});
        isParent[u] = true;
    }
}

void Reset()
{
    for (long i = 1; i <= n; i++) g[i].clear(), isParent[i] = false, isDeleted[i].clear(), vis[i] = false, deg[i] = 0;
    answer = 0;
    operations.clear();
    con.clear();
}

void visit(long u, long p)
{
    vis[u] = true;
    for (long v: g[u])
    {
        if (v == p || isDeleted[u][v]) continue;
        deg[u]++;
        visit(v, u);
    }
    if (u != p) deg[u]++;
    if (deg[u] <= 1)
    {
        if (con[con.size() - 1].first == 0) con[con.size() - 1].first = u;
        else con[con.size() - 1].second = u;
    }
}

void trace()
{
    for (long i = 1; i <= n; i++) if (!vis[i]) con.push_back(ii(0, 0)), visit(i, i);
    long V = con[0].first;
    long pos = 0;
    for (long i = 1; i < con.size(); i++)
    {
        operations[pos].u = V;
        operations[pos].v = con[i].first;
        if (con[i].second == 0) V = con[i].first;
        else V = con[i].second;
        pos++;
    }
    cout << operations.size() << '\n';
    for (long i = 0; i < operations.size(); i++)
    {
        cout << operations[i].x << ' ' << operations[i].y << ' ' << operations[i].u << ' ' << operations[i].v << '\n';
    }
}

void solve()
{
    cin >> n;
    for (long i = 1; i <= n - 1; i++)
    {
        long u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1, 1);
    trace();
    Reset();
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//    freopen("test.inp", "r", stdin);
    long nTest;
    cin >> nTest;
    while (nTest--)
    {
        solve();
    }
    return 0;
}