Problem: Takahashi loves walking on a tree. The tree where Takahashi walks has N vertices numbered 1 through N. The i-th of the N-1 edges connects Vertex a_i and Vertex b_i.

Takahashi has scheduled M walks. The i-th walk is done as follows:

* The walk involves two vertices u_i and v_i that are fixed beforehand.
* Takahashi will walk from u_i to v_i or from v_i to u_i along the shortest path.



The happiness gained from the i-th walk is defined as follows:

* The happiness gained is the number of the edges traversed during the i-th walk that satisfies one of the following conditions:
* In the previous walks, the edge has never been traversed.
* In the previous walks, the edge has only been traversed in the direction opposite to the direction taken in the i-th walk.



Takahashi would like to decide the direction of each walk so that the total happiness gained from the M walks is maximized. Find the maximum total happiness that can be gained, and one specific way to choose the directions of the walks that maximizes the total happiness.

Constraints

* 1 ≤ N,M ≤ 2000
* 1 ≤ a_i , b_i ≤ N
* 1 ≤ u_i , v_i ≤ N
* a_i \neq b_i
* u_i \neq v_i
* The graph given as input is a tree.

Input

Input is given from Standard Input in the following format:


N M
a_1 b_1
:
a_{N-1} b_{N-1}
u_1 v_1
:
u_M v_M


Output

Print the maximum total happiness T that can be gained, and one specific way to choose the directions of the walks that maximizes the total happiness, in the following format:


T
u^'_1 v^'_1
:
u^'_M v^'_M


where (u^'_i,v^'_i) is either (u_i,v_i) or (v_i,u_i), which means that the i-th walk is from vertex u^'_i to v^'_i.

Examples

Input

4 3
2 1
3 1
4 1
2 3
3 4
4 2


Output

6
2 3
3 4
4 2


Input

5 3
1 2
1 3
3 4
3 5
2 4
3 5
1 5


Output

6
2 4
3 5
5 1


Input

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


Output

9
2 4
6 3
5 6
4 5

Solution (in CPP):

Solution:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=20005;
int n,m,tot,fa[N],dep[N],son[N],q[N],tl,a[N],b[N],rev[N],del[N],c[N],ans;
vector<int>E[N],vec,G[N];
void dfs(int u,int f){
	fa[u]=f;dep[u]=dep[f]+1;
	for(int v:E[u])if(v!=f)dfs(v,u),++son[u];
}
void add(int u,int v){
	while(u!=v)
		if(dep[u]>dep[v])++c[u],u=fa[u];
		else ++c[v],v=fa[v];
}
void dfs2(int u){
	swap(a[u],b[u]);
	for(int v:G[u])dfs2(v);
}
int main(){
	scanf("%d%d",&n,&m);tot=m;
	for(int i=1,x,y;i<n;++i){
		scanf("%d%d",&x,&y);
		E[x].push_back(y);
		E[y].push_back(x);
	}
	dfs(1,0);
	for(int i=1;i<=m;++i){
		scanf("%d%d",&a[i],&b[i]);
		add(a[i],b[i]);vec.push_back(i);
	}
	for(int i=1;i<=n;++i)if(!son[i])q[++tl]=i;
	for(int i=1;i<=n;++i){
		int u=q[i];vector<int>tmp;
		for(int j=0;j<vec.size();++j)
			if(a[vec[j]]==u||b[vec[j]]==u)
				tmp.push_back(vec[j]),vec.erase(vec.begin()+j),--j;
		while(tmp.size()>=2){
			int p=tmp.back();tmp.pop_back();
			int q=tmp.back();tmp.pop_back();
			if(a[p]!=u)dfs2(p);
			if(b[q]!=u)dfs2(q);
			if(a[q]!=b[p]){
				a[++tot]=a[q];b[tot]=b[p];
				vec.push_back(tot);
				G[tot].push_back(p);G[tot].push_back(q);
				del[p]=del[q]=1;
//				printf("%d -> %d\n",tot,p);
//				printf("%d -> %d\n",tot,q);
			}
		}
		if(tmp.size()){
			int p=tmp.back();tmp.pop_back();
			if(a[p]!=u)dfs2(p);
			if(fa[u]!=b[p]){
				a[++tot]=fa[u];b[tot]=b[p];
				vec.push_back(tot);
				G[tot].push_back(p);del[p]=1;
//				printf("%d -> %d\n",tot,p);
			}
		}
		ans+=min(2,c[u]);
		if(!--son[fa[u]])q[++tl]=fa[u];
//		for(int j=1;j<=tot;++j)
//			printf("(%d,%d) rev=%d\n",a[j],b[j],rev[j]);
//		puts("");
//		for(auto j:vec)printf("%d ",j);
//		puts("");puts("");
	}
//	for(int i=1;i<=tot;++i)if(!del[i])dfs2(i);
	printf("%d\n",ans);
	for(int i=1;i<=m;++i){
		if(rev[i])swap(a[i],b[i]);
		printf("%d %d\n",a[i],b[i]);
	}
	return 0;
}