#include <bits/stdc++.h>
using namespace std;
const long long UNDEF = -1;
const long long INF = 2e9;
template <typename T>
inline bool chkmax(T &aa, T bb) {
  return aa < bb ? aa = bb, true : false;
}
template <typename T>
inline bool chkmin(T &aa, T bb) {
  return aa > bb ? aa = bb, true : false;
}
template <class T>
T extgcd(T a, T b, T &x, T &y) {
  for (T u = y = 1, v = x = 0; a;) {
    T q = b / a;
    swap(x -= q * u, u);
    swap(y -= q * v, v);
    swap(b -= q * a, a);
  }
  return b;
}
template <class T>
T mod_inv(T a, T m) {
  T x, y;
  extgcd(a, m, x, y);
  return (m + x % m) % m;
}
const long long mn = 2e5 + 4;
vector<long long> g[mn];
long long val[mn];
long long par[mn];
long long subtreeSize[mn];
long long initSubtreeSize(long long x, long long p) {
  if (subtreeSize[x] != UNDEF) return subtreeSize[x];
  par[x] = p;
  long long ans = val[x];
  for (auto &y : g[x]) {
    if (y == p) continue;
    ans += initSubtreeSize(y, x);
  }
  return subtreeSize[x] = ans;
}
long long getCentroid(long long all, long long initx) {
  long long x = initx;
  while (1) {
    pair<long long, long long> largest = make_pair(-1ll, -1ll);
    for (auto &y : g[x]) {
      if (y == par[x]) continue;
      chkmax(largest, make_pair(subtreeSize[y], y));
    }
    if (par[x] != -1) {
      chkmax(largest, make_pair(all - subtreeSize[x], par[x]));
    }
    if (largest.first <= all / 2)
      return x;
    else
      x = largest.second;
  }
}
vector<long long> obtain;
void dfs(long long x, long long p) {
  if (val[x]) obtain.push_back(x);
  val[x] = 0;
  for (auto &y : g[x]) {
    if (y == p) continue;
    dfs(y, x);
  }
}
vector<vector<long long> > pool;
int main() {
  long long n, k;
  scanf("%lld%lld", &n, &k);
  for (long long i = 0; i < n - 1; i++) {
    long long x, y;
    scanf("%lld%lld", &x, &y);
    --x;
    --y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  memset(val, 0, sizeof val);
  for (long long i = 0; i < 2 * k; i++) {
    long long x;
    scanf("%lld", &x);
    --x;
    val[x] = 1;
  }
  memset(subtreeSize, -1, sizeof subtreeSize);
  initSubtreeSize(0, -1);
  long long centroid = getCentroid(2 * k, 0);
  for (auto &y : g[centroid]) {
    if (y == par[centroid]) continue;
    dfs(y, centroid);
    pool.push_back(obtain);
    obtain.clear();
  }
  if (val[centroid]) {
    obtain.push_back(centroid);
    val[centroid] = 0;
    pool.push_back(obtain);
    obtain.clear();
  }
  for (long long x = 0; x < n; x++) {
    if (val[x]) obtain.push_back(x);
  }
  pool.push_back(obtain);
  long long pn = pool.size();
  priority_queue<pair<long long, long long> > pq;
  for (long long i = 0; i < pn; i++) {
    if (pool[i].size()) pq.push(make_pair(pool[i].size(), i));
  }
  printf("1\n%lld\n", centroid + 1);
  while (pq.size() >= 2) {
    auto a = pq.top();
    pq.pop();
    auto b = pq.top();
    pq.pop();
    --a.first;
    --b.first;
    long long ai = a.second, bi = b.second;
    printf("%lld %lld %lld\n", (pool[ai].back() + 1), (pool[bi].back()) + 1,
           centroid + 1);
    pool[ai].pop_back();
    pool[bi].pop_back();
    if (a.first) pq.push(a);
    if (b.first) pq.push(b);
  }
  assert(pq.empty());
}
