#include <bits/stdc++.h>
namespace Tree {
std::mt19937 mtRand(time(0));
inline int rng(int x) { return mtRand() % x + 1; }
const int M_MAX = 4097;
int n, m;
std::vector<int> nei[M_MAX];
int found;
std::vector<int> doQuery(int x) {
  if (nei[x].empty()) {
    printf("? %d\n", x), fflush(stdout);
    int cnt, temp;
    for (scanf("%d", &cnt), assert(cnt); cnt; --cnt)
      scanf("%d", &temp), nei[x].push_back(temp);
    if (nei[x].size() == 2) found = x;
  }
  return nei[x];
}
bool vis[M_MAX];
int dep[M_MAX];
inline int jumpToRoot(int now) {
  if (dep[now] == 1) return now;
  while (1) {
    doQuery(now), vis[now] = 1;
    if (found) return found;
    if (dep[now] == 2) {
      int cnt = 0;
      for (int y : nei[now])
        if (!vis[y]) {
          if (++cnt == 2) return y;
          doQuery(y), vis[y] = 1;
          if (found) return found;
        }
    }
    if (dep[now] == 3) {
      int cnt = 0;
      for (int x : nei[now])
        if (!vis[x]) {
          doQuery(x), vis[x] = 1;
          for (int y : nei[x])
            if (!vis[y]) {
              if (++cnt == 4 || (n == 4 && cnt == 2)) return y;
              doQuery(y), vis[y] = 1;
              if (found) return found;
            }
        }
      return 0;
    }
    const int lim = n - dep[now];
    int x = 0, choice = 0;
    for (int y : nei[now])
      if (!vis[y]) {
        x = y;
        break;
      }
    choice = x;
    for (int i = 1, from = now; i < lim; ++i) {
      doQuery(x);
      if (found) return found;
      for (int y : nei[x])
        if (y != from) {
          from = x, x = y;
          break;
        }
    }
    doQuery(x);
    if (nei[x].size() == 1) {
      for (int y : nei[now])
        if (!vis[y] && y != choice) {
          dep[y] = dep[now] - 1, now = y;
          break;
        }
    } else
      dep[choice] = dep[now] - 1, now = choice;
  }
}
inline std::vector<int> goThrough(int x, int from) {
  std::vector<int> route;
  while (1) {
    doQuery(x), route.push_back(x), vis[x] = 1;
    if (found || nei[x].size() == 1) return route;
    for (int y : nei[x])
      if (y != from) {
        from = x, x = y;
        break;
      }
  }
}
inline void clear() {
  found = 0;
  memset(vis + 1, 0, m), memset(dep + 1, 0, sizeof(int) * m);
  for (int i = 1; i <= m; ++i) nei[i].clear();
}
int solve(const int &_n) {
  n = _n, m = (1 << n) - 1, clear();
  if (n == 1) return 1;
  if (n == 3) {
    int st = rng(m);
    doQuery(st), vis[st] = 1;
    if (found) return found;
    if (nei[st].size() == 1) {
      doQuery(nei[st][0]), vis[nei[st][0]] = 1;
      int cnt = 0;
      for (int x : nei[nei[st][0]])
        if (!vis[x]) {
          if (++cnt == 2) return x;
          doQuery(x), vis[x] = 1;
          if (found) return found;
        }
    } else {
      int cnt = 0;
      for (int x : nei[st]) {
        if (++cnt == 3) return x;
        doQuery(x);
        if (found) return found;
      }
    }
  }
  int st = rng(m);
  doQuery(st), vis[st] = 1;
  if (found) return found;
  if (nei[st].size() == 1) {
    dep[nei[st][0]] = n - 1;
    return jumpToRoot(nei[st][0]);
  }
  std::vector<int> out[2] = {goThrough(nei[st][0], st),
                             goThrough(nei[st][1], st)};
  if (found) return found;
  if (out[0].size() == out[1].size()) {
    dep[nei[st][2]] = n - out[0].size() - 1;
    return jumpToRoot(nei[st][2]);
  } else {
    if (out[0].size() > out[1].size()) std::swap(out[0], out[1]);
    int x = out[1][(out[1].size() - out[0].size()) / 2 - 1];
    for (int y : nei[x])
      if (!vis[y]) {
        dep[y] = n - (out[0].size() + out[1].size()) / 2 - 1;
        return jumpToRoot(y);
      }
    return 0;
  }
}
}  // namespace Tree
int main() {
  int T;
  for (scanf("%d", &T); T; --T) {
    int n;
    scanf("%d", &n), assert(n);
    int ans = Tree::solve(n);
    printf("! %d\n", ans), fflush(stdout);
  }
  return 0;
}
