#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
long long int invmod(long long int x, long long int n, long long int mod) {
  if (n == 0) return 1 % mod;
  long long int half = invmod(x, n / 2, mod);
  half = (half * half) % mod;
  if (n % 2 == 1) half = (half * (x % mod)) % mod;
  return half;
}
long long int bin(long long int a[], long long int l, long long int r,
                  long long int x) {
  if (l <= r) {
    long long int m = l + (r - l) / 2;
    if (a[m] == x)
      return m;
    else if (a[m] > x)
      return bin(a, l, m - 1, x);
    else
      return bin(a, m + 1, r, x);
  } else
    return -1;
}
long long int power(long long int b, long long int e, long long int m) {
  if (e == 0) return 1;
  if (e % 2)
    return b * power(b * b % m, (e - 1) / 2, m) % m;
  else
    return power(b * b % m, e / 2, m);
}
long long int power(long long int b, long long int e) {
  if (e == 0) return 1;
  if (e % 2)
    return b * power(b * b, (e - 1) / 2);
  else
    return power(b * b, e / 2);
}
long long int ncr(long long int n, long long int r, long long int x) {
  if (r == 0) return 1;
  long long int fac[n + 1];
  fac[0] = 1;
  for (long long int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % x;
  return (fac[n] * power(fac[r], x - 2, x) % x * power(fac[n - r], x - 2, x) %
          x) %
         x;
}
long long int ncr(long long int n, long long int p) {
  long long int r = min(p, n - p), rf = 1, ln = 1;
  for (long long int i = 1; i <= r; i++) rf = rf * i;
  for (long long int i = 0; i < r; i++) ln = ln * (n - i);
  return ln / rf;
}
bool sbs(pair<long long int, long long int> &a,
         pair<long long int, long long int> &b) {
  return (a.second < b.second);
}
bool sbds(pair<long long int, long long int> &a,
          pair<long long int, long long int> &b) {
  return (a.second > b.second);
}
bool sdf(pair<long long int, long long int> &a,
         pair<long long int, long long int> &b) {
  return (a.first > b.first);
}
long long int SUM(long long int a[], long long int n) {
  long long int sum = 0;
  for (long long int i = 0; i < n; i++) sum += a[i];
  return sum;
}
long long int chkprm(long long int n) {
  long long int x = 5, s = sqrt(n);
  if (n < 2) return 0;
  if (n < 4) return 1;
  if ((n & 1) == 0) return 0;
  if (n % 3 == 0) return 0;
  while (x <= s) {
    if (n % x == 0) return 0;
    x += 2;
    if (n % x == 0) return 0;
    x += 4;
  }
  return 1;
}
long long int search(long long int mx, long long int i, long long int n) {
  if (i == n) return i;
  long long int x = (n - i + 1) / 2, m;
  cout << "? " << x << " ";
  for (long long int j = i; j <= i + x - 1; j++) cout << j << " ";
  cout << "\n";
  cout.flush();
  cin >> m;
  if (m == mx)
    return search(mx, i, i + x - 1);
  else
    return search(mx, i + x, n);
}
void myth() {
  long long int n;
  cin >> n;
  long long int k;
  cin >> k;
  set<long long int> a[k];
  for (long long int i = 0; i < k; i++) {
    long long int x;
    cin >> x;
    for (long long int j = 0; j < x; j++) {
      long long int y;
      cin >> y;
      a[i].insert(y);
    }
  }
  cout << "? " << n << " ";
  for (long long int i = 0; i < n; i++) cout << i + 1 << " ";
  cout << "\n";
  cout.flush();
  long long int mx1, mx2;
  cin >> mx1;
  long long int ind = search(mx1, 1, n);
  vector<long long int> ans;
  for (long long int i = 0; i < k; i++) {
    if (a[i].find(ind) != a[i].end()) {
      cout << "? " << n - a[i].size() << " ";
      for (long long int j = 1; j <= n; j++)
        if (a[i].find(j) == a[i].end()) cout << j << " ";
      cout << "\n";
      cout.flush();
      cin >> mx2;
      ans.push_back(mx2);
    } else
      ans.push_back(mx1);
  }
  cout << "! ";
  for (auto i : ans) cout << i << " ";
  cout.flush();
  string s;
  cin >> s;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long int test_case = 1;
  cin >> test_case;
  while (test_case--) {
    myth();
    cout << "\n";
  }
  cerr << "\n"
       << "Time Elasped : " << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
  return 0;
}
