//by yjz
#include<bits/stdc++.h>
using namespace std;
#define FF first
#define SS second
#define PB push_back
#define MP make_pair
#define foreach(it,s) for(__typeof((s).begin()) it=(s).begin();it!=(s).end();it++)
#ifndef LOCAL
#define cerr if(0)cout
#endif
typedef long long ll;
const int mod=1e9+7;
//My i/o stream
struct fastio
{
	char s[100000];
	int it, len;
	fastio() {it=len=0;}
	inline char get()
	{
		if (it<len) return s[it++]; it=0;
		len=fread(s, 1, 100000, stdin);
		if (len==0) return EOF; else return s[it++];
	}
	bool notend()
	{
		char c=get();
		while (c==' '||c=='\n') c=get();
		if (it>0) it--;
		return c!=EOF;
	}
}_buff;
#define geti(x) x=getnum()
#define getii(x,y) geti(x),geti(y)
#define getiii(x,y,z) getii(x,y),geti(z)
#define puti(x) putnum(x),putchar(' ')
#define putii(x,y) puti(x),puti(y)
#define putiii(x,y,z) putii(x,y),puti(z)
#define putsi(x) putnum(x),putchar('\n')
#define putsii(x,y) puti(x),putsi(y)
#define putsiii(x,y,z) putii(x,y),putsi(z)
inline ll getnum()
{
	ll r=0; bool ng=0; char c; c=_buff.get();
	while (c!='-'&&(c<'0'||c>'9')) c=_buff.get();
	if (c=='-') ng=1, c=_buff.get();
	while (c>='0'&&c<='9') r=r*10+c-'0', c=_buff.get();
	return ng?-r:r;
}
template <class T> inline void putnum(T x)
{
	if (x<0) putchar('-'), x=-x;
	register short a[20]={}, sz=0;
	while (x) a[sz++]=x%10, x/=10;
	if(sz==0) putchar('0');
	for (int i=sz-1; i>=0; i--) putchar('0'+a[i]);
}
inline char getreal() {char c=_buff.get(); while (c<=32) c=_buff.get(); return c;}
ll qpow(ll x, ll k) {return k==0? 1: 1ll*qpow(1ll*x*x%mod,k>>1)*(k&1?x:1)%mod;}
const int maxn = 2011;
int n, m;
vector<int> con[maxn], ord;
int fa[maxn];
vector<pair<int,int> > E;
vector<pair<int,int> > V[maxn];
const int maxtot = 4000111;
int to[maxtot], toc[maxtot], ans[maxtot];
void dfs(int x, int pre=-1)
{
	for (auto u : con[x])
	{
		if (u==pre) continue;
		fa[u] = x;
		dfs(u, x);
	}
	ord.PB(x);
}
void addpath(int x, int y)
{
	int id = E.size();
	E.PB(MP(x, y));
	V[x].PB(MP(y, id));
	V[y].PB(MP(x, id));
}
int cnt;
bool vis[maxn*maxn];
bool cover(int x, int to, int pre=-1)
{
	if (x==to) return true;
	for (auto u : con[x])
	{
		if (u==pre) continue;
		if (cover(u, to, x))
		{
			cnt += !vis[x*n+u];
			vis[x*n+u] = 1;
			return true;
		}
	}
	return false;
}
int main()
{
	getii(n, m);
	for (int i=1; i<n; i++)
	{
		int x, y;
		getii(x, y);
		con[x].PB(y);
		con[y].PB(x);
	}
	dfs(1);
	for (int i=0; i<m; i++)
	{
		int x, y;
		getii(x, y);
		addpath(x, y);
	}
	static bool del[maxn];
	for (auto x : ord)
	{
		del[x] = 1;
		auto lst = MP(-1, -1);
		for (auto e : V[x])
		{
			if (del[e.FF]) continue;
//			cerr<<"edge:"<<x<<","<<e.FF<<","<<e.SS<<endl;
			if (lst.FF==-1) lst = e;
			else
			{
				to[e.SS] = E.size();
				toc[e.SS] = E[e.SS]!=MP(x, e.FF);
				to[lst.SS] = E.size();
				toc[lst.SS] = 1^(E[lst.SS]!=MP(x, lst.FF));
				addpath(lst.FF, e.FF);
				lst = MP(-1, -1);
			}
		}
		if (lst.FF!=-1)
		{
			to[lst.SS] = E.size();
			toc[lst.SS] = E[lst.SS]!=MP(x, lst.FF);
			addpath(fa[x], lst.FF);
		}
	}
	for (int i=int(E.size())-1; i>=0; i--)
	{
//		cerr<<"i="<<i<<" to="<<to[i]<<" toc="<<toc[i]<<" ("<<E[i].FF<<","<<E[i].SS<<")"<<endl;
		if (!to[i]) ans[i] = 0;
		else
		{
			ans[i] = ans[to[i]]^toc[i];
		}
	}
	for (int i=0; i<m; i++)
	{
		if (ans[i]) swap(E[i].FF, E[i].SS);
	}
	for (int i=0; i<m; i++)
	{
		cover(E[i].FF, E[i].SS);
	}
	putsi(cnt);
	for (int i=0; i<m; i++)
	{
		putsii(E[i].FF, E[i].SS);
	}
	return 0;
}


Measured memory_bytes: 8960