Problem:
Score : 1500 points

Problem Statement

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.

Sample Input 1

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

Sample Output 1

6
2 3
3 4
4 2

If we decide the directions of the walks as above, he gains the happiness of 2 in each walk, and the total happiness will be 6.

Sample Input 2

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

Sample Output 2

6
2 4
3 5
5 1

Sample Input 3

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

Sample Output 3

9
2 4
6 3
5 6
4 5

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define space putchar(' ')
#define enter putchar('\n')
#define MAXN 2005
#define mp make_pair
#define pb push_back
//#define ivorysi
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
	if(c == '-') f = -1;
	c = getchar();
    }
    while(c >= '0' && c <= '9') {
	res = res * 10 + c - '0';
	c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) out(x / 10);
    putchar('0' + x % 10);
}
int N,M;
struct node {
    int to,next;
}E[MAXN * 2];
struct qry_node {
    int u,v;
}qry[MAXN * 2];
int head[MAXN],sumE,fa[MAXN],dep[MAXN];
vector<pii > rd[MAXN];
int dfn[MAXN],low[MAXN],col[MAXN],sta[MAXN],top,idx,instack[MAXN],tot;
vector<int> v[MAXN];
int dir[MAXN];
bool vis[MAXN];
void add(int u,int v) {
    E[++sumE].to = v;
    E[sumE].next = head[u];
    head[u] = sumE;
}

void add_path(int u,int v,int id) {
    int dir = 0;
    if(dep[u] < dep[v]) {swap(u,v);dir = 1;}
    while(dep[u] != dep[v]) {
	rd[u].pb(mp(id,dir));
	u = fa[u];
    }
    if(u == v) return;
    while(u != v) {
	rd[u].pb(mp(id,dir));
	rd[v].pb(mp(id,dir ^ 1));
	u = fa[u];v = fa[v];
    }
}

void dfs(int u) {
    dep[u] = dep[fa[u]] + 1;
    for(int i = head[u] ; i ; i = E[i].next) {
	int v = E[i].to;
	if(v != fa[u]) {
	    fa[v] = u;
	    dfs(v);
	}
    }
}

void Tarjan(int u) {
    dfn[u] = low[u] = ++idx;
    sta[++top] = u;
    instack[u] = 1;
    for(int i = head[u] ; i ; i = E[i].next) {
	int v = E[i].to;
	if(!dfn[v]) {
	    Tarjan(v);low[v] = min(low[v],low[u]);
	}
	else if(instack[v] == 1) {low[u] = min(low[u],dfn[v]);}
    }
    if(low[u] == dfn[u]) {
	++tot;
	while(1) {
	    int x = sta[top--];
	    col[x] = tot;
	    instack[x] = 2;
	    v[tot].pb(x);
	    if(x == u) break;
	}
    }
}
void Solve() {
    read(N);read(M);
    int a,b,ans = 0;
    for(int i = 1 ; i < N ; ++i) {
	read(a);read(b);
	add(a,b);add(b,a);
    }
    dfs(1);
    for(int i = 1 ; i <= M ; ++i) {
	read(qry[i].u);read(qry[i].v);
	add_path(qry[i].u,qry[i].v,i);
    }
    memset(head,0,sizeof(head));sumE = 0;
    for(int i = 1 ; i <= N ; ++i) {
	if(rd[i].size() >= 2) {
	    add(rd[i][0].fi * 2 + rd[i][0].se,rd[i][1].fi * 2 + (rd[i][1].se ^ 1));
	    add(rd[i][1].fi * 2 + (rd[i][1].se ^ 1),rd[i][0].fi * 2 + rd[i][0].se);
	    add(rd[i][0].fi * 2 + (rd[i][0].se ^ 1),rd[i][1].fi * 2 + rd[i][1].se);
	    add(rd[i][1].fi * 2 + rd[i][1].se,rd[i][0].fi * 2 + (rd[i][0].se ^ 1));
	    ans += 2;
	}
	else if(rd[i].size()) ++ans;
    }
    for(int i = 2 ; i <= N * 2 + 1; ++i) {
	if(!dfn[i]) Tarjan(i);
    }
    for(int i = 1 ; i <= tot ; ++i) {
	if(!vis[i]) {
	    for(auto k : v[i]) {
		dir[k / 2] = k & 1;
		vis[col[k ^ 1]] = 1;
	    }
	}
    }
    out(ans);enter;
    for(int i = 1 ; i <= M ; ++i) {
	if(!dir[i]) {out(qry[i].u);space;out(qry[i].v);enter;}
	else {out(qry[i].v);space;out(qry[i].u);enter;}
    }
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
}