#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

const int MAX_N = 2333;

int N, M, pa[MAX_N], deg[MAX_N];
bool done[MAX_N];
vector<int> edge[MAX_N];

void dfs(int x, int y, int pa[]) {
    pa[x] = y;
    for (int i : edge[x]) {
        if (i == y) continue;
        pa[i] = x;
        dfs(i, x, pa);
    }
}

void solve(pii walks[], int n) {
    int leaf = 0;
    for (int i = 1; i <= N; i++) {
        if (deg[i] == 0 && !done[i]) {
            done[leaf = i] = true;
            break;
        }
    }
    assert(leaf);
    done[leaf] = true;
    deg[pa[leaf]]--;
    pii trans[MAX_N];
    int m = 0, src[MAX_N];
    bool cut[MAX_N];
    fill_n(cut + 1, n, false);
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (walks[i].first == walks[i].second) continue;
        if (walks[i].first == leaf || walks[i].second == leaf) {
            cnt++;
            if (walks[i].second == leaf) swap(walks[i].first, walks[i].second);
        }
    }
    vector<int> attached;
    if (cnt >= 2) {
        for (int i = 1; i <= n && attached.size() < 2; i++) {
            if (walks[i].first == walks[i].second) continue;
            if (walks[i].first == leaf) {
                attached.push_back(i);
            }
        }
        trans[m = 1] = make_pair(walks[attached[0]].second, walks[attached[1]].second);
    }
    for (int i = 1; i <= n; i++) {
        if (walks[i].first == walks[i].second) continue;
        if (count(attached.begin(), attached.end(), i)) continue;
        trans[++m] = walks[i];
        src[m] = i;
        if (trans[m].first == leaf) {
            cut[i] = true;
            trans[m].first = pa[leaf];
        }
    }
    if (m == 0) return;
    solve(trans, m);
    if (!attached.empty()) {
        if (trans[1].first == walks[attached[1]].second)
            swap(attached[0], attached[1]);
        walks[attached[0]] = make_pair(trans[1].first, leaf);
        walks[attached[1]] = make_pair(leaf, trans[1].second);
    }
    for (int i = attached.empty() ? 1 : 2; i <= m; i++) {
        walks[src[i]] = trans[i];
    }
    for (int i = 1; i <= n; i++) {
        if (cut[i]) {
            if (walks[i].first == pa[leaf]) walks[i].first = leaf;
            else if (walks[i].second == pa[leaf]) walks[i].second = leaf;
        }
    }
}

int main() {
    scanf("%d%d", &N, &M);
    for (int i = 1; i < N; i++) {
        int a, b; scanf("%d%d", &a, &b);
        edge[a].push_back(b); edge[b].push_back(a);
    }
    dfs(1, 0, pa);
    for (int i = 1; i <= N; i++) deg[i] = edge[i].size() - (i != 1);
    pii walks[MAX_N];
    for (int i = 1; i <= M; i++) {
        scanf("%d%d", &walks[i].first, &walks[i].second);
    }
    solve(walks, M);
    vector<pii> cov;
    for (int i = 1; i <= M; i++) {
        int tpa[MAX_N];
        dfs(walks[i].first, 0, tpa);
        for (int j = walks[i].second; j != walks[i].first; j = tpa[j]) {
            cov.emplace_back(tpa[j], j);
        }
    }
    sort(cov.begin(), cov.end());
    cov.erase(unique(cov.begin(), cov.end()), cov.end());
    printf("%zu\n", cov.size());
    for (int i = 1; i <= M; i++) {
        printf("%d %d\n", walks[i].first, walks[i].second);
    }
}


Measured memory_bytes: 72816