#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
template <typename T>
istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec) is >> v;
  return is;
}
template <typename T>
bool chmax(T &m, const T q) {
  if (m < q) {
    m = q;
    return true;
  } else
    return false;
}
template <typename T>
bool chmin(T &m, const T q) {
  if (q < m) {
    m = q;
    return true;
  } else
    return false;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template <class c>
struct rge {
  c b, e;
};
template <class c>
rge<c> range(c i, c j) {
  return rge<c>{i, j};
}
template <class c>
auto dud(c *x) -> decltype(cerr << *x, 0);
template <class c>
char dud(...);
struct deb {
  ~deb() { cerr << endl; }
  template <class c>
  typename enable_if<sizeof dud<c>(0) != 1, deb &>::type operator<<(c i) {
    cerr << boolalpha << i;
    return *this;
  }
  template <class c>
  typename enable_if<sizeof dud<c>(0) == 1, deb &>::type operator<<(c i) {
    return *this << range(begin(i), end(i));
  }
  template <class c, class b>
  deb &operator<<(pair<b, c> d) {
    return *this << "(" << d.first << ", " << d.second << ")";
  }
  template <class c>
  deb &operator<<(rge<c> d) {
    *this << "[";
    for (auto it = d.b; it != d.e; ++it) *this << ", " + 2 * (it == d.b) << *it;
    return *this << "]";
  }
};
void err(istream_iterator<string> it) { return; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  err(++it, args...);
}
int interact(vector<int> &q) {
  cout << "? " << q.size() << ' ';
  for (int i = (0), i_end_ = ((int)q.size()); i < i_end_; i++) {
    cout << q[i] + 1 << ' ';
  }
  cout.flush();
  int x;
  cin >> x;
  assert(x != -1);
  return x;
}
vector<int> get_complement(vector<int> &rem, int n) {
  vector<int> ret(n, 0);
  for (int i = (0), i_end_ = ((int)rem.size()); i < i_end_; i++) {
    ret[rem[i]] = 1;
  }
  vector<int> ask;
  for (int i = (0), i_end_ = (n); i < i_end_; i++) {
    if (ret[i] == 0) {
      ask.push_back(i);
    }
  }
  return ask;
}
void solve() {
  int n, k;
  cin >> n >> k;
  vector<vector<int>> subsets(k);
  for (int i = (0), i_end_ = (k); i < i_end_; i++) {
    int c;
    cin >> c;
    subsets[i].resize(c);
    for (int j = (0), j_end_ = (c); j < j_end_; j++) {
      int x;
      cin >> x;
      x--;
      subsets[i][j] = x;
    }
  }
  vector<int> query;
  int l = 0;
  int r = k;
  for (int i = (0), i_end_ = (n); i < i_end_; i++) {
    query.push_back(i);
  }
  int maxm = interact(query);
  while (r - l >= 1) {
    query = {};
    int m = l + (r - l) / 2;
    for (int i = (l), i_end_ = (m + 1); i < i_end_; i++) {
      for (int j = (0), j_end_ = ((int)subsets[i].size()); j < j_end_; j++) {
        query.push_back(subsets[i][j]);
      }
    }
    int x = interact(query);
    if (x == maxm) {
      r = m;
    } else {
      l = m + 1;
    }
  }
  if (l <= k - 1) query = get_complement(subsets[l], n);
  if (l == k) {
    cout << "! ";
    for (int i = (0), i_end_ = (k); i < i_end_; i++) cout << maxm << ' ';
    cout.flush();
    cout << '\n';
    string isv;
    cin >> isv;
  } else {
    vector<int> answer(k);
    for (int i = (0), i_end_ = (k); i < i_end_; i++) {
      if (i == l) {
        int x = interact(query);
        answer[i] = x;
      } else {
        answer[i] = maxm;
      }
    }
    cout << '!' << ' ';
    for (int i = (0), i_end_ = ((int)answer.size()); i < i_end_; i++) {
      cout << answer[i] << ' ';
    }
    cout.flush();
    string isv;
    cin >> isv;
  }
}
int main() {
  int T = 1;
  cin >> T;
  for (int tt = 1; tt <= T; ++tt) {
    solve();
  }
  return 0;
}
lint pow_mod(lint base, lint expo) {
  lint ret = 1;
  for (; expo;) {
    if (expo & 1) ret = (ret * base) % 1000000007;
    expo = (expo >> 1);
    base = (base * base) % 1000000007;
  }
  return ret;
}
