//minamoto
#include<bits/stdc++.h>
#define R register
#define fi first
#define se second
#define pb push_back
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
inline void swap(R int &x,R int &y){R int t=x;x=y,y=t;}
typedef pair<int,int> pi;
const int N=1e6+5;
struct eg{int v,nx;}e[N<<1];int head[N],tot=1;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int deg[N],q[N],lasx[N],lasy[N],vis[N],dep[N],fa[N],sum[N],col[N],fv[N],fr[N];
pi p[N],np[N],rp[N];int n,m,rt,top,res;
vector<int>E[N];
inline int opp(R int x,R int y){return p[x].fi==y?p[x].se:p[x].fi;}
void dfs(int u){dep[u]=dep[fa[u]]+1;go(u)if(v!=fa[u])fa[v]=u,dfs(v);}
void fsd(int u){go(u)if(v!=fa[u])fsd(v),sum[u]+=sum[v];res+=min(sum[u],2);}
inline void er(R int x,R int y,R int z){(np[x].fi==y?np[x].fi:np[x].se)=z;}
inline int LCA(R int u,R int v){
	while(u!=v){
		if(dep[u]<dep[v])swap(u,v);
		u=fa[u];
	}
	return u;
}
void solve(){
	fp(i,1,m)np[i]=p[i];
	int u,now,x,y;
//	#define FR first
//	#define SE second
//	#define num np
//	#define fir p
//  for(int i=2;i<=n;i++) {
//  	int u=0;
//  	for(int j=2;j<=n;j++)
//  	  if (deg[j]==1&&!vis[j]) {
//  	  	  u=j;
//  	  	  break;
//		}
//	vis[u]=1;
//	int v=0;
//	for(int j=0;j<E[u].size();j++)
//	  if (!vis[E[u][j]]) {
//	  	v=E[u][j];
//	  	break;
//	  }
//	deg[v]--;
//	int id1=0,id2=0;
//	for(int j=1;j<=m;j++)
//	  if ((num[j].FR==u)^(num[j].SE==u)) {
//	  	if (!id1) id1=j;
//	  	else if (!id2) id2=j;
//	  }
////	  printf("%d %d %d\n",i,id1,id2);
//	if (!id1&&!id2) continue;
//	if (!id2) {
//		if (num[id1].FR==u) num[id1].FR=v;
//		else num[id1].SE=v; 
//		continue;
//	}
//	if (num[id1].FR==u) {
//		if (num[id2].FR==u) {
//			num[id1].FR=num[id2].SE;
//			col[id2]^=1;
//		}
//		else num[id1].FR=num[id2].FR;
//	}
//	else {
//		if (num[id2].SE==u) {
//			num[id1].SE=num[id2].FR;
//			col[id2]^=1;
//		}
//		else num[id1].SE=num[id2].SE;
//	}
//	num[id2].FR=num[id2].SE;
//	fr[id2]=id1;
//	for(int j=1;j<=m;j++)
//	  if ((num[j].FR==u)^(num[j].SE==u)) {
//	  	if (num[j].FR==u) num[j].FR=v;
//	  	else num[j].SE=v;
//	  }
//  }
//  for(int i=1;i<=m;i++)
//    if (fr[i]) col[i]^=col[fr[i]];
//  for(int i=1;i<=m;i++) {
//  	if (col[i]) swap(fir[i].FR,fir[i].SE);
//  	printf("%d %d\n",fir[i].FR,fir[i].SE);
//  }
	fp(T,2,n){
		fp(i,2,n)if(!vis[i]&&deg[i]==1){u=i;break;}
		vis[u]=1;
		go(u)if(!vis[v]){now=v;break;}
		--deg[now];
		x=y=0;
		fp(i,1,m)if((np[i].fi==u)^(np[i].se==u))x?y=i:x=i;
//		printf("%d %d %d\n",T,x,y);
		if(!x&&!y)continue;
		if(!y){er(x,u,now);continue;}
		if(np[x].fi==u){
			if(np[y].fi==u)np[x].fi=np[y].se,col[y]^=1;
			else np[x].fi=np[y].fi;
		}else{
			if(np[y].se==u)np[x].se=np[y].fi,col[y]^=1;
			else np[x].se=np[y].se;
		}
		fr[y]=x,np[y].fi=np[y].se;
		fp(i,1,m)if((np[i].fi==u)^(np[i].se==u))er(i,u,now);
	}
	fp(i,1,m)col[i]^=col[fr[i]];
	fp(i,1,m)if(col[i])swap(p[i].fi,p[i].se);
	
//  for(int i=1;i<=m;i++)
//    if (fr[i]) col[i]^=col[fr[i]];
}
//inline void clr(R int x){
//	R int u=p[x].fi,v=p[x].se,lca=LCA(u,v);
//	while(u!=lca)col[fv[u]]=0,u=fa[u];
//	while(v!=lca)col[fv[v]]=0,v=fa[v];
//}
//inline void jump(R int x){
//	R int u=p[x].fi,v=p[x].se,lca=LCA(u,v);
//	while(u!=lca)col[fv[u]]=1,u=fa[u];
//	while(v!=lca)col[fv[v]]=2,v=fa[v];
//}
//inline bool ck(R int x){
//	R int u=p[x].fi,v=p[x].se,lca=LCA(u,v);
//	while(u!=lca){
//		if(col[fv[u]]==1)return 1;
//		u=fa[u];
//	}
//	while(v!=lca){
//		if(col[fv[v]]==2)return 1;
//		v=fa[v];
//	}
//	return 0;
//}
//void solve(){
//	int h=1,t=0,u,sz=0,now,v,x,y,lca,xx,yy,tmp;
//	fp(i,1,n)if(deg[i]==1)q[++t]=i;
//	top=m;
//	while(h<=t&&sz<n-2){
//		u=q[h++],++sz,vis[u]=1;
////		printf("Now %d %d %d\n",u,sz,pos[u].size());
//		go(u)if(!vis[v]&&(--deg[now=v])==1)q[++t]=v;
//		for(auto v:pos[u])assert(p[v].fi!=p[v].se);
//		if(pos[u].empty())continue;
//		if(pos[u].size()==1){
////			puts("QAQ");
//			for(auto v:pos[u])if(p[v].fi!=now&&p[v].se!=now){
//				++top,p[top]=pi(now,tmp=opp(v,u));
//				pos[now].pb(top),lasx[top]=-v;
//				pos[tmp].erase(v),pos[tmp].pb(top);
//			}
//			continue;
//		}
//		x=y=0;
//		for(auto v:pos[u]){
//			if(!x){x=v;continue;}
//			if(!y){
//				y=v,xx=opp(x,u),yy=opp(y,u);
//				if(xx==yy){
////					puts("QAQ");
////					printf("%d %d\n",x,y);
////					printf("%d %d %d %d\n",p[x].fi,p[x].se,p[y].fi,p[y].se);
////					printf("%d\n",(jump(x),ck(y)));
////					clr(x),clr(y);
////					if(jump(x),ck(y))swap(p[y].fi,p[y].se),swap(lasx[y],lasy[y]);
////					clr(x),clr(y);
//					if(p[x]==p[y])swap(p[y].fi,p[y].se),swap(lasx[y],lasy[y]);
//					pos[xx].erase(x),pos[xx].erase(y);
////					printf("%d %d\n",xx,pos[xx].size());
////					printf("%d %d %d %d\n",p[x].fi,p[x].se,p[y].fi,p[y].se);
//					x=y=0;
//					continue;
//				}
//				++top,lasx[top]=x,lasy[top]=y;
////				printf("%d %d %d %d\n",x,y,xx,yy);
//				p[top]=pi(xx,yy);
//				pos[xx].erase(x),pos[yy].erase(y);
//				pos[xx].pb(top),pos[yy].pb(top);
//				x=y=0;
//				continue;
////				er(x,u,now),er(y,u,now);
////				printf("%d %d %d %d %d\n",u,np[x].fi,np[x].se,np[y].fi,np[y].se);
////				continue;
//			}
////			x=v;
//		}
//		if(x&&p[x].fi!=now&&p[x].se!=now){
//			++top,p[top]=pi(now,tmp=opp(x,u));
//			pos[now].pb(top),lasx[top]=-x;
//			pos[tmp].erase(x),pos[tmp].pb(top);
//		}
//	}
////	printf("%d %d\n",h,t);
////	puts("---------------------------");
//	int fl=0;
//	u=q[h],v=q[t];
////	printf("%d %d\n",pos[u].size(),pos[v].size());
//	for(auto x:pos[u]){
////			printf("%d %d %d %d\n",p[x].fi,p[x].se,u,v);
////		if(p[x].fi==u&&p[x].se==v||p[x].fi==v&&p[x].se==u){
//			if(!fl){
//				if(p[x]!=pi(u,v))p[x]=pi(u,v),swap(lasx[x],lasy[x]);
//				fl=1;
//			}else{
//				if(p[x]!=pi(v,u))p[x]=pi(v,u),swap(lasx[x],lasy[x]);
//			}
//	//		printf("%d %d %d %d\n",p[x].fi,p[x].se,u,v);
////			p[x]=fl?(fl=2,pi(u,v)):(fl=1,pi(v,u));
////		}
//	}
////	res+=fl;
//	fd(i,top,1){
////		printf("%d %d %d %d %d\n",i,p[i].fi,p[i].se,lasx[i],lasy[i]);
//		R int x=lasx[i],y=lasy[i];
//		if(x||y){
//			if(x<0||y<0){
//				x=-x,y=-y;if(!x)x=y;
//				if(p[i].fi==p[x].se||p[i].se==p[x].fi){
//					
//					swap(p[x].fi,p[x].se),swap(lasx[x],lasy[x]);
//					
////					printf("Change %d %d %d\n",x,p[x].fi,p[x].se);
//				}
//			}else{
//				if(p[x].fi!=p[i].fi)swap(p[x].fi,p[x].se),swap(lasx[x],lasy[x]);
//				if(p[y].se!=p[i].se)swap(p[y].fi,p[y].se),swap(lasx[y],lasy[y]);
//			}
//		}
//	}
//}
int main(){
//	freopen("testdata.in","r",stdin);
	scanf("%d%d",&n,&m);
	assert(n>2);
	for(R int i=1,u,v;i<n;++i){
		scanf("%d%d",&u,&v),add(u,v),add(v,u);
		++deg[u],++deg[v];
		E[u].pb(v),E[v].pb(u);
	}
	dfs(1);
	fp(i,1,m){
		scanf("%d%d",&p[i].fi,&p[i].se),np[i]=p[i];
		++sum[p[i].fi],++sum[p[i].se],sum[LCA(p[i].fi,p[i].se)]-=2;
	}
	fsd(1);
	printf("%d\n",res);
	solve();
	fp(i,1,m)printf("%d %d\n",p[i].fi,p[i].se);
	return 0;
}

Measured memory_bytes: 27516