#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > g, gr;
vector<bool> used, need;
vector<int> p;
int mx = 0, s, mn = 1e9, K = 0;
bool build(int v) {
  used[v] = 1;
  bool f = 0;
  for (int i = 0; i < g[v].size(); i++)
    if (!used[g[v][i]])
      if (build(g[v][i])) {
        gr[v].push_back(g[v][i]);
        gr[g[v][i]].push_back(v);
        K++;
        f = 1;
      }
  if (f) return 1;
  if (need[v]) return 1;
  return 0;
}
void dfs(int v, int kol) {
  used[v] = 1;
  if (kol > mx) {
    mx = kol;
    s = v;
  }
  for (int i = 0; i < gr[v].size(); i++)
    if (!used[gr[v][i]]) {
      p[gr[v][i]] = v;
      dfs(gr[v][i], kol + 1);
    }
}
void find_min(int v, int kol) {
  used[v] = 1;
  if (kol == (mx + 1) / 2) mn = min(mn, v);
  for (int i = 0; i < gr[v].size(); i++)
    if (!used[gr[v][i]]) find_min(gr[v][i], kol + 1);
}
int main() {
  int n, m, u, v;
  scanf("%d%d", &n, &m);
  g.resize(n);
  gr.resize(n);
  need.assign(n, 0);
  for (int i = 0; i < n - 1; i++) {
    scanf("%d%d", &u, &v);
    g[u - 1].push_back(v - 1);
    g[v - 1].push_back(u - 1);
  }
  for (int i = 0; i < m; i++) {
    scanf("%d", &u);
    --u;
    need[u] = 1;
  }
  if (m == 1) {
    printf("%d\n0", u + 1);
    return 0;
  }
  used.assign(n, 0);
  build(u);
  used.assign(n, 0);
  p.assign(n, -1);
  dfs(u, 0);
  used.assign(n, 0);
  p.assign(n, -1);
  mx = 0;
  dfs(s, 0);
  for (int i = 0; i < mx / 2; i++, s = p[s])
    ;
  used.assign(n, 0);
  find_min(s, 0);
  if (mx & 1) {
    used.assign(n, 0);
    find_min(p[s], 0);
  }
  printf("%d\n%d", mn + 1, 2 * K - mx);
}
