#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const long long INF = 1e9;
const long long MAXN = 1024;
const long long MAXM = 1e5 + 6;
int par[MAXN][MAXN], n;
vector<int> g1[MAXN];
pair<int, int> ask(vector<int> v) {
  if (v.size() == 0) return {INF, INF};
  cout << "? " << v.size();
  for (int i = 0; i < v.size(); i++) cout << " " << v[i];
  cout << '\n';
  cout.flush();
  pair<int, int> p;
  cin >> p.first >> p.second;
  return p;
}
void dfs(int u, int p) {
  par[u][1] = p;
  for (int i = 0; i < g1[u].size(); i++) {
    if (g1[u][i] != p) dfs(g1[u][i], u);
  }
}
bool b[MAXN];
void dfs1(int u, int p) {
  b[u] = 1;
  for (int i = 0; i < g1[u].size(); i++) {
    if (g1[u][i] != p) dfs1(g1[u][i], u);
  }
}
int solve1(int node, int t) {
  long long low = 1, high = t, mid, ans = 0;
  vector<int> query;
  while (low <= high) {
    mid = (low + high) / 2;
    query.clear();
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= mid; j++) {
        if (par[i][j] == node) {
          query.push_back(i);
          break;
        }
      }
    }
    pair<int, int> ff = ask(query);
    if (ff.second == t) {
      ans = mid;
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  if (ans == 0)
    return node;
  else {
    query.clear();
    for (int i = 1; i <= n; i++) {
      if (par[i][ans] == node) query.push_back(i);
    }
    return ask(query).first;
  }
}
void solve() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    g1[i].clear();
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    g1[x].push_back(y);
    g1[y].push_back(x);
  }
  vector<int> query;
  for (int i = 1; i <= n; i++) {
    query.push_back(i);
  }
  pair<int, int> pp = ask(query);
  int root = pp.first;
  dfs(root, 0);
  for (int i = 2; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      par[j][i] = par[par[j][i - 1]][1];
    }
  }
  query.clear();
  long long t = pp.second, low = max(1ll, t / 2 - 1), high = t, mid, ans, r;
  while (low <= high) {
    mid = (low + high) / 2;
    query.clear();
    for (int i = 1; i <= n; i++) {
      if (par[i][mid] == root) query.push_back(i);
    }
    pair<int, int> pp = ask(query);
    int f = pp.second;
    if (f == t) {
      ans = mid;
      r = pp.first;
      low = mid + 1;
    } else
      high = mid - 1;
  }
  long long ans1, ans2;
  ans1 = r;
  if (ans == t) {
    ans2 = root;
  } else {
    query.clear();
    bool b[MAXN];
    memset(b, 0, sizeof(b));
    for (int j = 1; j < MAXN; j++) b[par[ans1][j]] = 1;
    for (long long i = 1; i <= n; i++) {
      if (b[i]) continue;
      if (ans * 2 == t && i == ans1) continue;
      if (par[i][t - ans] == root) {
        query.push_back(i);
      }
    }
    ans2 = ask(query).first;
  }
  cout << "! " << ans1 << " " << ans2 << '\n';
  string verdict;
  cout.flush();
  cin >> verdict;
}
int main() {
  long long t;
  cin >> t;
  while (t--) solve();
  return 0;
}
