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 read();
#define LL long long
#define fr(i,l,r) for(int i = (l);i <= (r);++i)
#define rf(i,l,r) for(int i = (l);i >= (r);--i)
#define fo(i,l,r) for(int i = (l);i < (r);++i)
#define foredge(i,u,v) for(int i = fir[u],v;v = to[i],i;i = nxt[i])
#define ci const int &
#define cl const LL &
#define I inline void
#define filein(File) freopen(File".in","r",stdin)
#define fileout(File) freopen(File".out","w",stdout)

const int N = 1e5 + 5;
int n,du[N];
set<int> s[N];
I addedge(int u,int v) {
	s[u].insert(v);
}
struct Edge {
	int u,v;
} e[N];
typedef pair<int,int> pii;
#define mp make_pair
int ans;
vector<int> adj[N];
vector<pii> out;
int vis[N];
int main() {
	int t;
	cin >> t;
	while(t--) {
		cin >> n;
		ans = 0;
		fr(i,1,n) du[i] = 0,adj[i].clear(),vis[i] = 0,s[i].clear();
		for(int i = 1,u,v;i < n;++i) {
			cin >> u >> v;
			addedge(u,v),addedge(v,u);
			e[i].u = u; e[i].v = v;
		}
		queue<int> q;
		fr(i,1,n) if(s[i].size() == 1) q.push(i);
		while(!q.empty()) {
			int u = q.front(); q.pop();
			if(!s[u].size()) continue;
			if(adj[u].size() == 2) {
				for(set<int>::iterator it = s[u].begin();it != s[u].end();++it) {
					s[*it].erase(u);
					if(s[*it].size() == 1) q.push(*it);
				}
				s[u].clear();
				continue;
			}
			int v = *s[u].begin();
			if(adj[v].size() <= 1) {
				adj[u].push_back(v);
				adj[v].push_back(u);
			}
			s[u].erase(v);
			s[v].erase(u);
			if(s[v].size() == 1) q.push(v);
		}
		out.clear();
		fr(i,1,n-1) {
			int u = e[i].u,v = e[i].v,ok = 0;
			fo(j,0,adj[u].size()) if(adj[u][j] == v) {
				ok = 1;break;
			}
			if(!ok) out.push_back(mp(u,v));
		}
		int last = -1;
		fr(i,1,n) if(adj[i].size() == 1 && !vis[i]) {
			int cur = adj[i][0],pre = i,res;
			vis[cur] = vis[pre] = 1;
			if(last != -1) out.push_back(mp(last,pre));
			while(adj[cur].size() != 1) {
				res = adj[cur][0] ^ adj[cur][1] ^ pre;
				pre = cur,cur = res;
				vis[cur] = 1;
			}
			last = cur;
		}
		fr(i,1,n) if(adj[i].size() == 0) {
			if(last != -1) out.push_back(mp(last,i));
			last = i;
		}
		cout << (ans = out.size() / 2) << endl;
		fo(i,0,ans) {
			cout << out[i].first << ' ' << out[i].second << ' ';
			cout << out[i+ans].first << ' ' << out[i+ans].second << endl;
		}
	}
	return 0;
}

const int S = 1 << 21;
char p0[S],*p1,*p2;
#define getchar() (p2 == p1 && (p2 = (p1 = p0) + fread(p0,1,S,stdin)) == p1 ? EOF : *p1++)
inline int read() {
	static int x,c,f;x = 0;f = 1;
	do c = getchar(),c == '-' && (f = -1);while(!isdigit(c));
	do x = x * 10 + (c & 15),c = getchar();while(isdigit(c));
	return x * f;
}