#include <bits/stdc++.h>
#define FR first
#define SE second
//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;
using namespace std;
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;}
typedef pair<int,int> pi;

vector <int> E[2005];
int deg[2005];

int fa[N],dep[N];

int sum[N];
int ans;
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];ans+=min(sum[u],2);}
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;
}

int fr[N];
bool col[N],vis[N];

pi num[N],fir[N];

  #define fi first
  #define se second
  #define np num
  #define p fir
inline void er(R int x,R int y,R int z){(np[x].fi==y?np[x].fi:np[x].se)=z;}
int main() {
//	freopen("testdata.in","r",stdin);
  int n,m;
	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);
//  int ans=0;
//  for(int i=1;i<=n;i++) ans+=min(sum[i],2);
  printf("%d\n",ans);
	fp(T,2,n){
		int u,now,x,y;
		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=2;i<=n;i++) {
//  	int u=0;
//  	for(int j=2;j<=n;j++)
//  	  if (d[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;
//	  }
//	d[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;
//	p[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++) printf("%d %d\n",fir[i].FR,fir[i].SE);
  return 0;
}

Measured memory_bytes: 4048