#include <bits/stdc++.h>
using namespace std;
struct node {
  int nx, v;
} q[20005];
int cnt, n, stid, m, nw;
bool cmp(node a, node b) {
  if (a.v < m && b.v < m) return a.v > b.v;
  return a.v < b.v;
}
void query(int x) {
  printf("? %d\n", x);
  fflush(stdout);
  int a, b;
  scanf("%d%d", &a, &b);
  q[cnt].nx = b, q[cnt].v = a;
}
int main() {
  srand(1927);
  scanf("%d%d%d", &n, &stid, &m);
  if (n < 2000) {
    while (++cnt <= n) {
      query(stid);
      if (q[cnt].v >= m) {
        printf("! %d\n", q[cnt].v);
        return 0;
      }
      stid = q[cnt].nx;
    }
    printf("! -1\n");
    return 0;
  }
  while (cnt <= 1000) {
    int x = (rand() % n * rand() % n + n) % n;
    cnt++;
    query(x + 1);
  }
  sort(q + 1, q + 1001, cmp);
  nw = stid;
  if (q[1].v < m) nw = q[1].nx;
  while (nw != -1) {
    cnt++;
    query(nw);
    if (q[cnt].v >= m) {
      printf("! %d\n", q[cnt].v);
      return 0;
    }
    nw = q[cnt].nx;
  }
  printf("! -1\n");
}
