#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
vector<int> AdjList[maxn];
bool marked[maxn];
int n, k;
int child[maxn];
vector<int> sub_tree[maxn];
int belong[maxn];
int root;
void dfs(int s, int p) {
  if (marked[s]) child[s] = 1;
  for (int u : AdjList[s]) {
    if (u != p) {
      dfs(u, s);
      child[s] += child[u];
    }
  }
}
int findcen(int s, int p, int sz) {
  for (int u : AdjList[s]) {
    if (u != p) {
      if (child[u] > sz / 2) return findcen(u, s, sz);
    }
  }
  return s;
}
int cur = 0;
void dfs2(int s, int p) {
  if (p == root) {
    cur++;
    belong[s] = cur;
    if (marked[s]) sub_tree[cur].push_back(s);
  } else {
    belong[s] = belong[p];
    if (marked[s]) sub_tree[belong[p]].push_back(s);
  }
  for (int u : AdjList[s]) {
    if (u != p) dfs2(u, s);
  }
}
struct my_comparator {
  bool operator()(const int &a, const int &b) const {
    return sub_tree[a].size() < sub_tree[b].size();
  }
};
using my_priority_queue = std::priority_queue<int, vector<int>, my_comparator>;
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    AdjList[u].push_back(v);
    AdjList[v].push_back(u);
  }
  for (int i = 0; i < 2 * k; i++) {
    int c;
    cin >> c;
    marked[c] = true;
  }
  dfs(1, 1);
  root = findcen(1, 1, 2 * k);
  dfs2(root, 0);
  cout << 1 << endl << root << endl;
  my_priority_queue yeah;
  for (int i = 0; i <= cur; i++) {
    if (sub_tree[i].size()) yeah.push(i);
  }
  while (yeah.size()) {
    int a1 = yeah.top();
    yeah.pop();
    int a2 = yeah.top();
    yeah.pop();
    cout << sub_tree[a1].back() << " " << sub_tree[a2].back() << " " << root
         << endl;
    sub_tree[a1].pop_back();
    sub_tree[a2].pop_back();
    if (sub_tree[a1].size()) yeah.push(a1);
    if (sub_tree[a2].size()) yeah.push(a2);
  }
}
