#include <bits/stdc++.h>
using namespace std;
const int INF = 0x7fffffff;
int H;
bool isAsked[999];
bool isDown[999];
int FastAns = -1;
vector<int> Memo[999];
int cnt;
vector<int> ask(int v) {
  if (isAsked[v] == true) return Memo[v];
  isAsked[v] = true;
  cnt++;
  printf("? %d\n", v);
  fflush(stdout);
  vector<int> temp;
  int k;
  scanf("%d", &k);
  if (k == 2) FastAns = v;
  for (int i = 0, x; i < k; i++) scanf("%d", &x), temp.push_back(x);
  Memo[v] = temp;
  return temp;
}
bool findLeaf(int v, int p, int maxH) {
  if (maxH == 0) return false;
  vector<int> now = ask(v);
  for (int w : now)
    if (w != p) {
      bool next = findLeaf(w, v, maxH - 1);
      if (next) isDown[v] = next;
      return next;
    }
  isDown[v] = true;
  return true;
}
int Lv[999];
int find(int p, int h) {
  if (H - h <= 2) {
    queue<pair<int, int> > Q;
    Q.push(make_pair(p, 0));
    Lv[p] = 0;
    vector<int> Ans;
    while (!Q.empty()) {
      pair<int, int> now = Q.front();
      Q.pop();
      Ans.push_back(now.first);
      if (Lv[now.first] == 2) continue;
      vector<int> list = ask(now.first);
      if (FastAns != -1) return FastAns;
      for (int w : list) {
        if (isDown[w] == true) continue;
        if (w == now.second) continue;
        Lv[w] = Lv[now.first] + 1;
        Q.push(make_pair(w, now.first));
      }
    }
    if (FastAns != -1) return FastAns;
    for (int ans : Ans) {
      if (cnt < 16) ask(ans);
      if (FastAns != -1) return FastAns;
    }
    return Ans.back();
  } else {
    int oneP, oneH;
    vector<int> one = ask(p);
    if (FastAns != -1) return FastAns;
    for (int i = 1; i <= H; i++) {
      bool find = false;
      for (int x : one) {
        if (isDown[x] == true) continue;
        if (findLeaf(x, p, i)) find = true;
      }
      if (find) {
        oneH = i + 2;
        break;
      }
    }
    oneP = -1;
    for (int x : one)
      if (isDown[x] == false) oneP = x;
    if (oneP == -1) oneP = one.back();
    isDown[p] = true;
    if (FastAns != -1) return FastAns;
    return find(oneP, oneH);
  }
}
int findRoot() {
  vector<int> one = ask(1);
  if (one.size() == 2) return 1;
  int oneH, oneP;
  if (one.size() == 1) {
    oneH = 2;
    oneP = one[0];
  } else {
    for (int i = 1; i <= H; i++) {
      bool find = false;
      for (int j = 0; j < 2; j++)
        if (findLeaf(one[j], 1, i)) find = true;
      if (find) {
        oneH = i + 2;
        break;
      }
    }
    oneP = -1;
    for (int j = 0; j < 2; j++)
      if (isDown[one[j]] == false) oneP = one[j];
    if (oneP == -1) oneP = one.back();
    isDown[1] = true;
  }
  if (FastAns != -1) return FastAns;
  return find(oneP, oneH);
}
int main() {
  int tc;
  scanf("%d", &tc);
  while (tc--) {
    scanf("%d", &H);
    for (int i = 1; i < (1 << H); i++) {
      vector<int> temp;
      Memo[i].swap(temp);
      isDown[i] = false;
      isAsked[i] = false;
      Lv[i] = 0;
    }
    FastAns = -1;
    cnt = 0;
    printf("! %d\n", findRoot());
    fflush(stdout);
  }
  return 0;
}
