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;
int T,f[100004][2],n;
vector<int>g[1000004];
void dfs(int x,int par){
	f[x][1]=0;
	int MX=0;
	for(auto y:g[x])if(y!=par)dfs(y,x),f[x][1]+=min(f[y][1],f[y][0])+1;
	for(auto y:g[x])if(y!=par)MX=max(min(f[y][0],f[y][1])+1-f[y][1],MX);
	f[x][1]-=MX;
	f[x][0]=0;
	int P1=0,P2=0;
	for(auto y:g[x])if(y!=par){
		f[x][0]+=min(f[y][1],f[y][0])+1;
		int tmp=min(f[y][0],f[y][1])+1-f[y][1];
		if(P1<tmp)P2=P1,P1=tmp;
		else if(P2<tmp)P2=tmp;
	}
	f[x][0]-=P1+P2;
}
int root,lst;
pair<int,int> dfs1(int x,int par,int typ){
	int P1=0,p1=-1,P2=0,p2=-1;
	for(auto y:g[x])if(y!=par){
		int tmp=min(f[y][0],f[y][1])+1-f[y][1];
		if(P1<tmp)P2=P1,p2=p1,P1=tmp,p1=y;
		else if(P2<tmp) P2=tmp,p2=y;
	}
	if(typ==0){
		for(auto y:g[x])if(y!=par&&y!=p1&&y!=p2){
			pair<int,int> tmp=dfs1(y,x,(f[y][0]>f[y][1]));
			printf("%d %d %d %d\n",x,y,tmp.first,lst);
			lst=tmp.second;
		}
		if(P1==0)return make_pair(x,x);
		if(P2==0)return make_pair(dfs1(p1,x,1).first,x);
		return make_pair(dfs1(p2,x,1).first,dfs1(p1,x,1).first);
	}else{
		for(auto y:g[x])if(y!=par&&y!=p1){
			pair<int,int> tmp=dfs1(y,x,(f[y][0]>f[y][1]));
			printf("%d %d %d %d\n",x,y,tmp.first,lst);
			lst=tmp.second;
		}
		if(P1==0)return make_pair(x,x);
		return make_pair(dfs1(p1,x,1).first,x);
	}
}
void sol(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)g[i].clear();
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v),g[v].push_back(u);
	}
	for(int i=1;i<=n;i++)if(g[i].size()==1)root=i;
	dfs(root,0);
	lst=root;
	printf("%d\n",f[root][0]);
	dfs1(root,0,0);
}
int main(){
	scanf("%d",&T);
	while(T--)sol();
}