#include <bits/stdc++.h>   #pragma GCC target( sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx )   using namespace std;   inline bool isDigit(char c) { return  0  <= c && c <=  9 ; }   template <class T>   inline T sqr(T x) {     return x * x;   }   template <class T>   inline bool isSquare(T x) {     int y = sqrt(x + 0.5);     return (y * y) == x;   }   template <class T1, class T2>   inline T1 gcd(T1 a, T2 b) {     return b ? gcd(b, a % b) : a;   }   template <class T1, class T2>   inline T1 eqMin(T1& x, const T2& y) {     if (T1(y) < x) return x = y;     return x;   }   template <class T1, class T2>   inline T1 eqMax(T1& x, const T2& y) {     if (T1(y) > x) return x = y;     return x;   }   template <class T1, class T2>   inline T1 min(const T1& x, const T2& y) {     return x < (T1)y ? x : (T1)y;   }   template <class T1, class T2>   inline T1 max(T1& x, const T2& y) {     return x > (T1)y ? x : (T1)y;   }   template <typename T>   inline T getint() {     T x = 0, p = 1;     char ch;     do {       ch = getchar();     } while (ch <=    );     if (ch ==  - ) p = -1, ch = getchar();     while (ch >=  0  && ch <=  9 ) x = x * 10 + ch -  0 , ch = getchar();     return x * p;   }   template <class T1, class T2>   ostream& operator<<(ostream& os, const pair<T1, T2>& p) {     return os <<  (  << p.first <<  ,   << p.second <<  ) ;   }   template <class T>   ostream& operator<<(ostream& os, const vector<T>& v) {     os <<  { ;     bool was = false;     for (const T& x : v) {       if (was) os <<  ,  ;       was = true;       os << x;     }     os <<  } ;     return os;   }   template <class T>   ostream& operator<<(ostream& os, const set<T>& v) {     os <<  [ ;     bool was = false;     for (const T& x : v) {       if (was) os <<  ,  ;       was = true;       os << x;     }     os <<  ] ;     return os;   }   template <class T>   ostream& operator<<(ostream& os, const multiset<T>& v) {     os <<  [ ;     bool was = false;     for (const T& x : v) {       if (was) os <<  ,  ;       was = true;       os << x;     }     os <<  ] ;     return os;   }   template <class T1, class T2>   ostream& operator<<(ostream& os, const map<T1, T2>& m) {     os <<  < ;     bool was = false;     for (const auto& x : m) {       if (was) os <<  ,  ;       was = true;       os << x;     }     os <<  > ;     return os;   }   template <size_t sz>   ostream& operator<<(ostream& os, const bitset<sz>& bit) {     os <<  / ;     for (int i = 0; i < sz; i++) os << bit[i];     os <<     ;     return os;   }   const double PI = acos(-1);   const double EPS = 1e-8;   const int INF = (int)2e9;   const long long LINF = (long long)2e18;   const int MOD = (int)1e9 + 7;   const int MAXN = (int)1e5 + 10;   int n, s, x;   int val[MAXN], nxt[MAXN];   int p[MAXN];   bool us[MAXN];   int cnt = 0;   void read(int x) {     if (us[x]) return;     us[x] = true;     cout <<  ?   << x <<   n ;     cout.flush();     cin >> val[x] >> nxt[x];     cout.flush();   }   int main() {     ios_base::sync_with_stdio(false);     srand(time(NULL));     cin >> n >> s >> x;     cout.flush();     for (int i = 1; i <= n; i++) {       p[i] = i;     }     random_shuffle(p + 1, p + n + 1);     read(s);     int ss = s;     s = 0;     val[0] = -1;     for (int i = 1; i <= min(n / 2, 1300); i++) {       read(p[i]);       if (val[p[i]] < x && val[p[i]] > val[s]) {         s = p[i];       }     }     if (val[ss] < x && val[ss] > val[s]) {       s = ss;     }     if (s) {       while (val[s] < x) {         s = nxt[s];         if (s == -1) {           cout <<  ! -1                 <<   n ;           cout.flush();           return 0;         }         read(s);         if (val[s] >= x) {           cout <<  !   << val[s] <<   n ;           cout.flush();           return 0;         }         if (nxt[s] == -1) {           cout <<  ! -1                 <<   n ;           cout.flush();           return 0;         }       }     }     cout <<  !   << val[ss] <<   n ;     cout.flush();   }