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>
#define mod 1000000007
#define pie (3.141592653589)
using namespace std;

const int N = 1e5 + 10;

vector<int> adj[N];
vector<int> uu(N);
vector<pair<int, int>> add_edge;
vector<pair<int, int>> remove_edge;

void dfs(int source, int parent = -1)
{
	int start = -1;
	int end = -1;
	for(int u : adj[source])
	{
		if(u == parent)
		{
			continue;
		}
		dfs(u, source);
		if(uu[u] != -1)
		{
			if(start == -1)
				start = uu[u];
			else if(end == -1)
				end = uu[u];
			else
				add_edge.emplace_back(u, uu[u]), remove_edge.emplace_back(source, u);
		}
		else
			remove_edge.emplace_back(source, u);
	}
	if(end != -1)
		add_edge.emplace_back(start, end), uu[source] = -1;
	else
		uu[source] = start == -1 ? source : start;
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout << fixed;
	cout.precision(10);
	int T = 1;
	cin >> T;
	while(T--)
	{
		int n;
		cin >> n;
		for(int i = 0; i < n - 1; i++)
		{
			int u, v;
			cin >> u >> v;
			--u; --v;
			adj[u].push_back(v);
			adj[v].push_back(u);
		}
		dfs(0);
		if(uu[0] != -1)
			add_edge.emplace_back(0, uu[0]);
		cout << (int) remove_edge.size() << '\n';
		for(int i = 0; i < (int) remove_edge.size(); i++)
		{
			cout << remove_edge[i].first + 1 << ' ' << remove_edge[i].second + 1 << ' ' << add_edge[i].second + 1 << ' ' << add_edge[i + 1].first + 1 << '\n';
		}
		for(int i = 0; i <= n; i++)
			adj[i].clear();
		add_edge.clear();
		remove_edge.clear();
	}
	return 0;
}