#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
const int N = 1 << 7;
int vis[N];
vector<int> adj[N];
int H, D, cnt;
void query(int n) {
  cnt++;
  vis[n] = 1;
  printf("? %d\n", n);
  fflush(stdout);
}
void output(int n) {
  printf("! %d\n", n);
  fflush(stdout);
}
int dfs_brute(int u, int d) {
  if (d == D + 1) return 0;
  if (d == D and cnt == 16) return u;
  query(u);
  int sz, a;
  scanf("%d", &sz);
  while (sz--) scanf("%d", &a), adj[u].push_back(a);
  if ((int)(adj[u].size()) == 2) return u;
  int ans;
  for (auto v : adj[u])
    if (not vis[v] and (ans = dfs_brute(v, d + 1))) return ans;
  return 0;
}
bool dfs_leaf(int u, vector<int>& A) {
  query(u);
  A.push_back(u);
  int sz, a;
  scanf("%d", &sz);
  while (sz--) scanf("%d", &a), adj[u].push_back(a);
  sz = (int)(adj[u].size());
  if (sz == 2)
    return true;
  else if (sz == 1)
    return false;
  for (auto v : adj[u])
    if (not vis[v]) return dfs_leaf(v, A);
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    scanf("%d", &H);
    cnt = 0;
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i < N; i++) adj[i].clear();
    bool ok = false;
    int cur = 1, sz, a;
    while (not ok) {
      if (cnt == 16) break;
      query(cur);
      scanf("%d", &sz);
      for (int i = 0; i < sz; i++) {
        scanf("%d", &a);
        if (not vis[a]) adj[cur].push_back(a);
      }
      if (sz == 2) {
        ok = true;
        break;
      }
      vector<int> right, left;
      right.push_back(cur);
      if (dfs_leaf(adj[cur][0], right)) {
        ok = true;
        cur = right.back();
        break;
      }
      if (sz > 2 and dfs_leaf(adj[cur][1], left)) {
        ok = true;
        cur = left.back();
        break;
      }
      reverse(left.begin(), left.end());
      for (auto it : right) left.push_back(it);
      int h = ((int)(left.size())) / 2 + 1;
      cur = left[h - 1];
      for (auto it : adj[cur])
        if (!vis[it]) cur = it;
      h++;
      if (h == H) {
        ok = true;
        break;
      }
      if (h >= 5) {
        D = H - h + 1;
        cur = dfs_brute(cur, 1);
        break;
      }
    }
    output(cur);
  }
  return 0;
}
