#include <bits/stdc++.h>
using namespace std;
int n, k, u = -1;
const int maxn = 2e5 + 1;
vector<vector<int>> tree(maxn);
vector<int> cols(maxn), dp(maxn), d;
void dfs(int x, int p = -1) {
  dp[x] += cols[x];
  int maxval = 0;
  for (int y : tree[x]) {
    if (y == p) continue;
    dfs(y, x);
    dp[x] += dp[y];
    maxval = max(maxval, dp[y]);
  }
  maxval = max(maxval, 2 * k - dp[x]);
  if (maxval <= k) u = x;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k;
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    cin >> x >> y;
    tree[x].push_back(y);
    tree[y].push_back(x);
  }
  d.resize(2 * k);
  for (int &i : d) {
    cin >> i;
    cols[i] = 1;
  }
  dfs(1);
  if (u == -1) exit(1);
  vector<int> c2(n + 1);
  c2[u] = u;
  queue<int> q;
  for (int i : tree[u]) {
    c2[i] = i;
    q.push(i);
  }
  while (q.size()) {
    int cur = q.front();
    q.pop();
    for (int x : tree[cur]) {
      if (!c2[x]) {
        c2[x] = c2[cur];
        q.push(x);
      }
    }
  }
  vector<int> zct(n + 1);
  vector<vector<int>> vz(n + 1);
  for (int x : d) {
    zct[c2[x]]++;
    vz[c2[x]].push_back(x);
  }
  priority_queue<pair<int, int>> pq;
  for (int i = 1; i <= n; i++) {
    if (zct[i]) {
      pq.push({zct[i], i});
    }
  }
  vector<pair<int, int>> ans;
  while (pq.size()) {
    auto cur1 = pq.top();
    pq.pop();
    auto cur2 = pq.top();
    pq.pop();
    zct[cur1.second]--;
    if (zct[cur1.second]) pq.push(make_pair(zct[cur1.second], cur1.second));
    zct[cur2.second]--;
    if (zct[cur2.second]) pq.push(make_pair(zct[cur2.second], cur2.second));
    ans.push_back(make_pair(vz[cur1.second].back(), vz[cur2.second].back()));
    vz[cur1.second].pop_back();
    vz[cur2.second].pop_back();
  }
  cout << 1 << '\n' << u << '\n';
  for (auto p : ans) {
    cout << p.first << ' ' << p.second << ' ' << u << '\n';
  }
  return 0;
}
