#include<bits/stdc++.h>

using namespace std;
const long long MOD = 998244353;
const long long N = 2e5 + 9;
const long long OO = 2e18;
const double PI = acos(-1.0);
#define IOS ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
#define int long long int
#define ld long double
#define ve vector<int>
#define vep vector<pair<int,int>>
#define graph vector<ve>
#define visit vector<bool>
#define db(...) 7
#define fix(res, n) fixed <<  setprecision(n) << (long double)res
#define tc         int testcase;   cin>>testcase;   while(testcase--)
#define all(num)      (num).begin(), (num).end()
#define el            cout<<(testcase?"\n":"")


//             "وَأَن لَّيْسَ لِلْإِنسَانِ إِلَّا مَا سَعَى ﴿39﴾ وَأَنَّ سَعْيَهُ سَوْفَ يُرَى ﴿40﴾ ثُمَّ يُجْزَاهُ الْجَزَاء الْأَوْفَى "
//                                  My way to My dream
//#ifdef ONLINE_JUDGE
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//#endif
//int n , m ;
//bool ok (int x , int y)
//{
//    return x>=0&&y>=0&&x<n&&y<m;
//}
//ve dx={1,0,-1,0,1,-1,1,-1};
//ve dy={0,1,0,-1,-1,1,1,-1};
ve dx = {1, 0, -1, 0};
ve dy = {0, 1, 0, -1};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void bfs(int i, graph &g, ve &dist, set<int> &st, ve &mdist) {
    queue<int> q;
    q.push(i);
    dist[i] = 0;
    if (st.find(i) != st.end()) {
        mdist.push_back(dist[i]);
    }
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        for (auto x: g[node]) {
            if (dist[x] == -1) {
                q.push(x);
                dist[x] = dist[node] + 1;
                if (st.find(x) != st.end()) {
                    mdist.push_back(dist[x]);
                }
            }
        }
    }
}

signed main() {
    IOS
    tc {

        int n, k, start;
        cin >> n >> k;

        set<int> st;

        for (int i = 0; i < k; ++i) {
            int num;
            cin >> num;
            st.insert(num);
        }

        graph g(n + 1);
        ve dist(n + 1, -1),   mset,  ans(n + 1);

        for (int i = 0; i < n - 1; ++i) {
            int u, v;
            cin >> u >> v;

            g[u].push_back(v);
            g[v].push_back(u);

        }

        for (int i = 1; i <= n; ++i) {

            if (g[i].size() == 1)
                start = i;

        }

        bfs(start, g, dist, st, mset);

        std::sort(mset.begin(), mset.end());
        for (int i = 1; i <= n; ++i) {

            ans[i] = max(abs(dist[i] - mset.front()), abs(dist[i] - mset.back()));

        }

        cout << *min_element(ans.begin() + 1, ans.end());
        el;
    }
}