#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T& num) {
  num = 0;
  bool f = true;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = false;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    num = num * 10 + ch - '0';
    ch = getchar();
  }
  num = f ? num : -num;
}
int out[100];
template <class T>
inline void write(T x, char ch) {
  if (x == 0) {
    putchar('0');
    putchar(ch);
    return;
  }
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  int num = 0;
  while (x) {
    out[num++] = (x % 10);
    x = x / 10;
  }
  for (int i = (num - 1); i >= (0); i--) putchar(out[i] + '0');
  putchar(ch);
}
const double eps = 1e-8;
int sume;
struct Edge {
  int from, to, next;
  Edge(int _f = 0, int _to = 0, int _n = 0) : from(_f), to(_to), next(_n){};
} e[500005];
int n, mn = 1070000000, k;
int sz[300005], v[300005], first[500005];
int t[3][300005];
int root = 0;
void addedge(int x, int y) {
  sume++;
  e[sume] = Edge(x, y, first[x]);
  first[x] = sume;
}
int dfs(int x, int fa) {
  int sum = 0, mx = 0;
  sz[x] = v[x];
  bool flag = true;
  for (int i = first[x]; i; i = e[i].next)
    if (e[i].to != fa) {
      int ret = dfs(e[i].to, x);
      sz[x] += ret;
      mx = max(mx, ret);
      if (mx > k) flag = false;
    }
  if (k + k - sz[x] > k) flag = false;
  if (flag && root == 0) root = x;
  return sz[x];
}
vector<int> ans;
void dfs2(int x, int fa, int p) {
  if (v[x]) ans.push_back(x);
  for (int i = first[x]; i; i = e[i].next)
    if (e[i].to != fa) dfs2(e[i].to, x, p);
}
int main() {
  read(n);
  read(k);
  for (int i = (1); i <= (n - 1); i++) {
    int x, y;
    read(x);
    read(y);
    addedge(x, y);
    addedge(y, x);
  }
  for (int i = (1); i <= (k + k); i++) {
    int x;
    read(x);
    v[x]++;
  }
  puts("1");
  dfs(1, 0);
  bool flag = true;
  write(root, '\n');
  dfs2(root, 0, 1);
  for (int i = (0); i <= (k - 1); i++) {
    write(ans[i], ' ');
    write(ans[i + k], ' ');
    write(root, '\n');
  }
}
