#include<bits/stdc++.h>
using namespace std;
const int maxn=2010;
struct node{
	int s,t;
}a[maxn];
int beg[maxn],tto[maxn<<1],nex[maxn<<1],e=1;
void putin(int s,int t){
	tto[++e]=t;
	nex[e]=beg[s];
	beg[s]=e;
}
vector<int> vec[maxn],edg[maxn];
int cnt[maxn];
bool color(int u,int t,int id,int fa){
	if(u==t) return 1;
	for(int i=beg[u];i;i=nex[i]){
		if(tto[i]==fa) continue;
		if(color(tto[i],t,id,u)){
			vec[i>>1].push_back(id);
			edg[id].push_back(i);
			return 1;
		}
	}
	return 0;
}
bool ok[maxn<<1],vis[maxn];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	int s,t;
	for(int i=1;i<n;i++){
		scanf("%d%d",&s,&t);
		putin(s,t);
		putin(t,s);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a[i].s,&a[i].t);
		color(a[i].s,a[i].t,i,-1);
	}
	int ans=0;
	for(int i=1;i<n;i++){
		cnt[i]=vec[i].size();
		ans+=cnt[i]<=2?cnt[i]:2;
	}
	int p;
	bool rev;
	while(1){
		for(p=1;p<n;p++){
			if(cnt[p]==1&&ok[p<<1]!=ok[p<<1|1])
				break;
		}
		if(p==n){
			for(p=1;p<n&&!cnt[p];p++);
			if(p==n) break;
		}
		while(vis[vec[p].back()]) vec[p].pop_back();
		int x=vec[p].back();
		rev=0;
		for(vector<int>::iterator it=edg[x].begin();it!=edg[x].end();it++){
			if((*it)/2==p){
				if(ok[*it]){
					rev=1;
					swap(a[x].s,a[x].t);
				}
				break;
			}
		}
		for(vector<int>::iterator it=edg[x].begin();it!=edg[x].end();it++){
			ok[(*it)^rev]=1;
			cnt[(*it)>>1]--;
		}
		vis[x]=1;
	}
	printf("%d\n",ans);
	for(int i=1;i<=m;i++)
		printf("%d %d\n",a[i].s,a[i].t);
	return 0;
}
