#include <bits/stdc++.h>
using namespace std;
inline int ri() {
  int x;
  scanf("%d", &x);
  return x;
}
template <typename T>
inline bool smax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
inline bool smin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
const int maxn = 200010;
long long w[maxn], sz[maxn], len[maxn], n, m;
vector<int> g[maxn];
void dfs1(int x, int pa) {
  sz[x] = w[x];
  for (int t : g[x])
    if (t != pa) {
      dfs1(t, x);
      sz[x] += sz[t];
      len[x] += sz[t] + len[t];
    }
}
long long dfs(int x, int pa, int r) {
  vector<int> v;
  int d = sz[x] - 2 * r;
  int h = -1;
  long long res = 0;
  for (int t : g[x])
    if (t != pa) {
      if (sz[t] - d > r) {
        h = t;
      } else {
        res += len[t] + sz[t];
      }
    }
  if (h < 0)
    return res;
  else
    return res + d + 2 * r - (sz[h] - d) + dfs(h, x, sz[h] - d - r);
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < (2 * m); i++) {
    int x;
    cin >> x;
    x--;
    w[x] = 1;
  }
  for (int i = (1); i < (n); i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs1(0, -1);
  cout << dfs(0, -1, m) << endl;
  return 0;
}
