#include<bits/stdc++.h>
#define ll int
#define ntr "\n"
#define mod (ll)(1e9+7)
#define taskname "temp"
#define frep freopen(taskname".inp","r",stdin); freopen(taskname".out","w",stdout);
using namespace std;
ll n,m,k,q;
ll movex[]={1,-1,0,0,0,0};
ll movey[]={0,0,1,-1,0,0};
ll movez[]={0,0,0,0,1,-1};
bool check(ll x,ll y,ll z){
return x>0&&x<=n&&y>0&&y<=m&&z>0&&z<=k;
}
void query(ll x,ll y,ll z){
cout<<"? "<<x<<' '<<y<<' '<<z<<endl;
cout.flush();
}
void ans(ll x,ll y,ll z){
cout<<"! "<<x<<' '<<y<<' '<<z<<endl;
cout.flush();
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//frep;
cin>>n>>m>>k>>q;
ll board[n+1][m+1][k+1],vis[n+1][m+1][k+1];
memset(board,0x3f,sizeof(board));
memset(vis,0,sizeof(vis));
priority_queue<array<ll,4>> pq;
vector<ll> a={1,n},b={1,m},c={1,k};
for(auto x:a){
for(auto y:b){
for(auto z:c){
if(board[x][y][z]>1e9){
query(x,y,z);
ll c;
cin>>c;
board[x][y][z]=c;
pq.push({c,x,y,z});
}
}
}
}
while(q>0){
ll x=pq.top()[1];
ll y=pq.top()[2];
ll z=pq.top()[3];
pq.pop();
//cout<<x<<' '<<y<<' '<<z<<ntr;
for(int i=0;i<6;i++){
ll nx=x+movex[i];
ll ny=y+movey[i];
ll nz=z+movez[i];
if(q==0) break;
if(check(nx,ny,nz)){
if(board[nx][ny][nz]>1e9){
query(nx,ny,nz);
ll c;
cin>>c;
board[nx][ny][nz]=c;
pq.push({c,nx,ny,nz});
q--;
if(c>board[x][y][z]) break;
}
}
}
ll mx=-1;
for(int i=0;i<6;i++){
ll nx=x+movex[i];
ll ny=y+movey[i];
ll nz=z+movez[i];
if(check(nx,ny,nz)){
mx=max(mx,board[nx][ny][nz]);
}
}
//cout<<x<<' '<<y<<' '<<z<<' '<<mx<<endl;
if(board[x][y][z]>=mx){
ans(x,y,z);
return 0;
}
if(q==0) break;
}
}