#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template <class T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define int long long
#define ll long long
#define mkp(a,b) make_pair(a,b)
#define rep(i,a,b) for (int i = a; i < b; i++)
#define rrep(i,a,b) for (int i = a; i >= b; i--)
#define endl '\n'
#define pb push_back
pair<int,int> mods = {1000000007,998244353};
int MD = mods.first;
ll MX_ll = 1e18;
int MX_VL = 2e9;
int GN = 1e5+10;
void N() {cout<<"NO\n";}
void Y() {cout<<"YES\n";}
void isTrue(const bool ope) {if (ope) Y();else N();}
int pw(int x,int t) {int res = 1;while (t--) res *= x;return res;}
int lg(int x,int b) {int res = 0;while (x >= b) {x/=b;res++;}return res;}
int sqr_t(int x) {
if (x==0)return 0;int l = 1;int r = x;int res = 1;while (l<=r) {int m = (l+r)/2;if (m*m == x)return m;if (m*m>x) {r = m-1;} else {res = m;l = m+1;}}
return res;
}
int fastPow(int x,int p) {
int res = 1;
while (p) {
if (p%2) {
res = (x*res)%MD;
}
x = (x*x)%MD;
p = (p>>1);
}
return res;
}
int pwdiv(int x,int y) {
int res = (x*fastPow(y,MD-2))%MD;
return res;
}
int mdb(int x,int md) {
int res = x%md;
return res < 0 ? res+md : res;
}
int neutral = MX_ll;
pair<int,int> merge1(pair<int,int> a,pair<int,int> b) {
int c1 = b.second-a.first;
int c2 = b.second-b.first;
int c3 = a.second-a.first;
int mx = max({c1,c2,c3});
if(mx==c1) {
return mkp(a.first,b.second);
}
if(mx==c2) {
return b;
}
return a;
}
pair<int,int> merge2(pair<int,int> a,pair<int,int> b) {
int c1 = a.second-b.first;
int c2 = b.second-b.first;
int c3 = a.second-a.first;
int mx = max({c1,c2,c3});
if(mx==c1) {
return mkp(b.first,a.second);
}
if(mx==c2) {
return b;
}
return a;
}
void update(int v,int l,int r,int p,pair<int,int> ele,vector<pair<int,int>>& seg) {
if (l==r && p == r) seg[v] = mkp(ele.second,ele.second);
else if (l <= p && r >= p) {
int m = (l+r)/2;
update(2*v,l,m,p,ele,seg);
update(2*v+1,m+1,r,p,ele,seg);
if(ele.first==1) {
seg[v] = merge1(seg[2*v],seg[2*v+1]);
}
else {
seg[v] = merge2(seg[2*v],seg[2*v+1]);
ele.first=2;
}
}
}
// int query(int v,int l,int r,int L,int R,vector<int>& seg) {
// if (l >= L && r <= R) return seg[v];
// if (r < L || l > R) return neutral;
// int m = (l+r)/2;
// return merge(query(2*v,l,m,L,R,seg),query(2*v+1,m+1,r,L,R,seg));
// }
//***-------------------------------------------------------------------------------------****
bool query(int x,int y) {
cout<<"examine "<<y<<" "<<x<<endl;
cout.flush();
string s;
cin>>s;
if(s=="false") return false;
return true;
}
void solve() {
int n,x0,y0;
cin>>n>>x0>>y0;
swap(x0,y0);
int r=n;
int rt = n;
int ld = 1;
rep(i,y0+1,n+1) {
if(!query(x0,i)) {
r = i-1;
break;
}
}
int l = 1;
rrep(i,y0-1,1) {
if(!query(x0,i)) {
l = i+1;
break;
}
}
rep(i,x0+1,n+1) {
if(!query(i,y0)) {
rt = i-1;
break;
}
}
rrep(i,x0-1,1) {
if(!query(i,y0)) {
ld = i+1;
break;
}
}
x0 = (ld+rt)/2;
y0 = (l+r)/2;
int m = r-l+1;
int fr = 0;
int bh = 0;
int tp = 0;
int bt = 0;
rep(t,1,5) {
if(y0+t*m <= n && query(x0,y0+t*m)) {
fr++;
}
if(y0-t*m >= 1 && query(x0,y0-t*m)) {
bh++;
}
if(x0+t*m <= n && query(x0+t*m,y0)){
tp++;
}
if(x0-t*m >= 1 && query(x0-t*m,y0)){
bt++;
}
}
if(bh+fr==1) {
if(fr) y0+=m;
else y0-=m;
if(tp) x0+=m;
else x0 -= m;
} else {
if(fr==2) y0 += 2*m;
else if(fr==0) y0 -= 2*m;
if(tp==2) x0 += 2*m;
else if(tp==0) x0 -= 2*m;
}
cout<<"solution "<<y0<<" "<<x0<<endl;
cout.flush();
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
// cin>>t;
while (t--) {
solve();
}
}