#include <bits/stdc++.h>
using namespace std;
int h;
int n;
int k;
int cnt;
int height[3000];
vector<int> memo[3000];
vector<int> Ask(int x) {
  if (!memo[x].empty()) return memo[x];
  cnt++;
  printf("? %d\n", x);
  fflush(stdout);
  scanf("%d", &k);
  if (k == 0) {
    exit(0);
  }
  int t = 11451411;
  for (int i = 0; i < k; i++) {
    scanf("%d", &t);
    memo[x].push_back(t);
  }
  return memo[x];
}
void Answer(int x) {
  printf("! %d\n", x);
  fflush(stdout);
}
int ProbeDepthWith(int v, int g, int prev) {
  if (memo[v].empty()) return 1;
  if (g <= 0) {
    if (memo[v].size() >= 2) return 2;
    return 1;
  }
  vector<int> &es = memo[v];
  if (es.size() == 1) return 1;
  int ret = -1;
  for (int i = 0; i < 3; i++) {
    if (prev == es[i]) continue;
    if (memo[es[i]].empty()) continue;
    int res = ProbeDepthWith(es[i], g - 1, v);
    if (res == -1) return -1;
    return res + 1;
  }
  return 2;
}
int ProbeDepth(int v, int g, int prev) {
  if (g <= 0) {
    if (memo[v].size() >= 2) return 2;
    return 1;
  }
  vector<int> es = Ask(v);
  if (es.size() == 2) {
    Answer(v);
    return -1;
  }
  if (es.size() == 1) return 1;
  for (int i = 0; i < 3; i++) {
    if (prev == es[i]) continue;
    if (!memo[es[i]].empty()) {
      int res = ProbeDepth(es[i], g - 1, v);
      if (res == -1) return -1;
      return res + 1;
    }
  }
  for (int i = 0; i < 3; i++) {
    if (prev == es[i]) continue;
    int res = ProbeDepth(es[i], g - 1, v);
    if (res == -1) return -1;
    return res + 1;
  }
  assert(0);
}
bool FindGoal(int v, int g, int prev) {
  if (g == 0) {
    if (cnt == 16) {
      Answer(v);
      return true;
    }
    vector<int> es = Ask(v);
    if (es.size() == 2) {
      Answer(v);
      return true;
    }
    return false;
  }
  vector<int> es = Ask(v);
  for (int i = 0; i < es.size(); i++) {
    if (es[i] == prev) continue;
    if (FindGoal(es[i], g - 1, v)) return true;
  }
  return false;
}
void solve() {
  srand(time(NULL));
  scanf("%d", &h);
  if (h == 0) {
    exit(0);
  }
  cnt = 0;
  n = (1 << h) - 1;
  for (int i = 0; i <= n; i++) {
    memo[i].clear();
    height[i] = -1;
  }
  queue<int> q;
  q.push(rand() % n + 1);
  int st = 114514;
  while (1) {
    assert(!q.empty());
    int v = q.front();
    q.pop();
    vector<int> ns = Ask(v);
    if (ns.size() == 2) {
      Answer(v);
      return;
    }
    if (ns.size() == 1) {
      height[v] = 1;
      st = v;
      break;
    }
    for (int u : ns) {
      q.push(u);
    }
  }
  int prev = 114514;
  while (1) {
    assert(height[st] > 0);
    vector<int> es = Ask(st);
    if (es.size() == 1) {
      prev = st;
      st = es[0];
      height[st] = 2;
      continue;
    }
    if (es.size() == 2) {
      Answer(st);
      return;
    }
    bool found = false;
    for (int i = 0; i < 3; i++) {
      if (es[i] == prev) continue;
      if (height[st] < h - 2) {
        int g = height[st] - 1;
        int b = ProbeDepthWith(es[i], g, st);
        if (b == -1) return;
        if (b >= g + 1) {
          prev = st;
          st = es[i];
          height[st] = height[prev] + 1;
          found = true;
          break;
        }
      } else {
        goto fail;
      }
    }
    if (found) continue;
    if (cnt == 16) goto fail;
    bool surely_next = false;
    for (int i = 0; i < 3; i++) {
      if (es[i] == prev) continue;
      if (surely_next) {
        prev = st;
        st = es[i];
        height[st] = height[prev] + 1;
        break;
      }
      if (height[st] < h - 2) {
        int g = height[st] - 1;
        int b = ProbeDepth(es[i], g, st);
        if (b == -1) return;
        if (b >= g + 1) {
          prev = st;
          st = es[i];
          height[st] = height[prev] + 1;
          break;
        } else
          surely_next = true;
      } else {
        goto fail;
      }
    }
  }
fail:
  assert(height[st] >= h - 2);
  if (FindGoal(st, h - height[st], st)) return;
  Answer(-1);
}
int t;
int main() {
  setbuf(stdout, NULL);
  scanf("%d", &t);
  while (t--) {
    solve();
  }
}
