#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
bool ckmin(T &a, U b) {
  return b < a ? a = b, true : false;
}
template <typename T, typename U>
bool ckmax(T &a, U b) {
  return b > a ? a = b, true : false;
}
int n, tt;
set<int> sub3;
vector<int> dep, dep3;
vector<vector<int>> adj;
vector<vector<int>> sub2;
pair<int, int> qry(vector<int> &v) {
  cout << "? " << (int)(v).size() << " ";
  for (auto i : v) cout << i + 1 << " ";
  cout << endl;
  pair<int, int> res;
  cin >> res.first >> res.second;
  res.first--;
  return res;
}
void dfs(int v, int p) {
  if (v) dep[v] = dep[p] + 1;
  for (auto i : adj[v]) {
    if (i == p) continue;
    dfs(i, v);
  }
}
void dfs2(int v) {
  sub3.insert(v);
  sub2[dep[v]].push_back(v);
  for (auto i : adj[v]) {
    if (dep[i] > dep[v]) dfs2(i);
  }
}
void dfs3(int v, int p) {
  if (v != p) dep3[v] = dep3[p] + 1;
  for (auto i : adj[v]) {
    if (i == p) continue;
    dfs3(i, v);
  }
}
int main() {
  cin >> tt;
  while (tt--) {
    dep.clear();
    adj.clear();
    sub2.clear();
    sub3.clear();
    dep3.clear();
    cin >> n;
    dep.assign(n, 0);
    dep3.assign(n, 0);
    adj.assign(n, vector<int>());
    sub2.assign(n + 1, vector<int>());
    for (int i = 0; i < n - 1; ++i) {
      int u, v;
      cin >> u >> v;
      u--, v--;
      adj[u].push_back(v);
      adj[v].push_back(u);
    }
    dfs(0, 0);
    vector<int> qry1(n);
    for (int i = 0; i < n; ++i) {
      qry1[i] = i;
    }
    pair<int, int> lca = qry(qry1);
    vector<int> qry2;
    for (auto i : adj[lca.first]) {
      if (dep[i] > dep[lca.first]) {
        qry2.push_back(i);
      }
    }
    int res1 = 0, mx = 0, l, r;
    pair<int, int> sub = {-1, -1};
    if ((int)(qry2).size()) sub = qry(qry2);
    if (sub.second != lca.second) {
      res1 = lca.first;
      goto nxt;
    }
    mx = 0;
    dfs2(sub.first);
    for (int i = 0; i < (int)(sub2).size(); ++i) {
      if ((int)(sub2[i]).size()) mx = i;
    }
    l = dep[sub.first], r = mx;
    while (l <= r) {
      int m = l + (r - l) / 2;
      vector<int> cur = sub2[m];
      assert((int)(cur).size());
      pair<int, int> ans = qry(cur);
      if (ans.second == lca.second) {
        l = m + 1;
        res1 = ans.first;
      } else {
        r = m - 1;
      }
    }
  nxt:;
    vector<int> qrylast;
    dfs3(res1, res1);
    for (int i = 0; i < n; ++i) {
      if (dep3[i] == lca.second) {
        qrylast.push_back(i);
      }
    }
    assert((int)(qrylast).size());
    pair<int, int> last = qry(qrylast);
    assert(last.second == lca.second);
    cout << "! " << last.first + 1 << " " << res1 + 1 << endl;
    string v;
    cin >> v;
  }
  return 0;
}
