#include <bits/stdc++.h>
using namespace std;
const long long int MOD = 1000000007;
const long long int INF = (long long int)1e15;
const long long int MAX = 14;
struct RootedTree {
  RootedTree(int n, int root = 0) : mRoot(root) { mVertexTbl.resize(n); }
  void addEdge(int a, int b, long long int cost = 1) {
    mVertexTbl[a].child.push_back(pair<int, long long int>(b, cost));
    mVertexTbl[b].child.push_back(pair<int, long long int>(a, cost));
  }
  void build() {
    queue<tuple<int, int, long long int>> q;
    q.push(make_tuple(mRoot, -1, 0));
    while (!q.empty()) {
      auto t = q.front();
      q.pop();
      int index = get<0>(t);
      int parent = get<1>(t);
      long long int depth = get<2>(t);
      mVertexTbl[index].parent = parent;
      mVertexTbl[index].depth = depth;
      for (auto it = mVertexTbl[index].child.begin();
           it != mVertexTbl[index].child.end();) {
        int nxt = (*it).first;
        if (nxt == parent) {
          mVertexTbl[index].child.erase(it);
          continue;
        }
        q.push(make_tuple(nxt, index, depth + (*it).second));
        ++it;
      }
    }
  }
  struct Vertex {
    vector<pair<int, long long int>> child;
    long long int depth = 0;
    int parent = -1;
  };
  int mRoot;
  vector<Vertex> mVertexTbl;
};
pair<long long int, long long int> Query(vector<long long int> &v) {
  cout << "? " << v.size();
  for (long long int(i) = (0); (i) < (v.size()); ++(i)) {
    cout << " " << v[i] + 1;
  }
  cout << endl;
  pair<long long int, long long int> ret;
  cin >> ret.first >> ret.second;
  ret.first--;
  return ret;
}
bool Answer(pair<long long int, long long int> t) {
  cout << "! " << t.first + 1 << " " << t.second + 1 << endl;
  string s;
  cin >> s;
  return s == "Correct";
}
pair<long long int, long long int> getEdge(RootedTree &tree,
                                           vector<long long int> &Cost) {
  long long int base = tree.mRoot;
  queue<long long int> q;
  q.push(base);
  vector<long long int> ans;
  while (!q.empty()) {
    long long int t = q.front();
    q.pop();
    long long int count = 0;
    for (auto &n : tree.mVertexTbl[t].child) {
      if (Cost[n.first] != Cost[base]) continue;
      count++;
      q.push(n.first);
    }
    if (count == 0) ans.push_back(t);
  }
  pair<long long int, long long int> p(base, base);
  if (ans.size() > 0) p.first = ans[0];
  if (ans.size() > 1) p.second = ans[1];
  return p;
}
void solve() {
  long long int N;
  cin >> N;
  RootedTree tree(N);
  vector<long long int> Cost(N, INF);
  for (long long int(i) = (0); (i) < (N - 1); ++(i)) {
    long long int a, b;
    cin >> a >> b;
    a--;
    b--;
    tree.addEdge(a, b);
  }
  long long int base = 0;
  long long int cnt = MAX - 1;
  {
    vector<long long int> v;
    for (long long int(i) = (0); (i) < (N); ++(i)) {
      v.push_back(i);
    }
    pair<long long int, long long int> ret = Query(v);
    base = ret.first;
    Cost[base] = ret.second;
  }
  tree.mRoot = base;
  tree.build();
  for (long long int(_) = (0); (_) < (cnt); ++(_)) {
    vector<long long int> v;
    pair<long long int, long long int> edge = getEdge(tree, Cost);
    long long int len =
        std::max(1LL, (Cost[base] - tree.mVertexTbl[edge.first].depth -
                       tree.mVertexTbl[edge.second].depth) /
                          2);
    {
      queue<long long int> q;
      q.push(edge.first);
      while (!q.empty()) {
        long long int t = q.front();
        q.pop();
        long long int count = 0;
        for (auto &n : tree.mVertexTbl[t].child) {
          if (Cost[n.first] != INF) continue;
          count++;
          q.push(n.first);
        }
        long long int depth =
            tree.mVertexTbl[t].depth - tree.mVertexTbl[edge.first].depth;
        if ((count == 0 || depth == len) && t != edge.first) v.push_back(t);
      }
    }
    {
      queue<long long int> q;
      q.push(edge.second);
      while (!q.empty()) {
        long long int t = q.front();
        q.pop();
        long long int count = 0;
        for (auto &n : tree.mVertexTbl[t].child) {
          if (Cost[n.first] != INF) continue;
          count++;
          q.push(n.first);
        }
        long long int depth =
            tree.mVertexTbl[t].depth - tree.mVertexTbl[edge.second].depth;
        if ((count == 0 || depth == len) && t != edge.second) v.push_back(t);
      }
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    if (v.size() == 0) break;
    pair<long long int, long long int> ret = Query(v);
    if (ret.second > Cost[base]) {
      queue<long long int> q;
      for (long long int(i) = (0); (i) < (v.size()); ++(i)) {
        q.push(v[i]);
      }
      while (!q.empty()) {
        long long int t = q.front();
        q.pop();
        Cost[t] = ret.second;
        for (auto &n : tree.mVertexTbl[t].child) {
          q.push(n.first);
        }
      }
      continue;
    }
    long long int node = ret.first;
    while (node >= 0) {
      Cost[node] = ret.second;
      node = tree.mVertexTbl[node].parent;
    }
  }
  Answer(getEdge(tree, Cost));
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  long long int T;
  cin >> T;
  for (long long int(_) = (0); (_) < (T); ++(_)) {
    solve();
  }
  return 0;
}
