#include <stdio.h>
#include <stdlib.h>
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
int query(int x, int y, int z, vector<vector<vector<ll>>> &v) {
if(v[x][y][z]) return v[x][y][z];
printf("? %d %d %d\n", x, y, z);
fflush(stdout);
int ans = -1;
(void)scanf("%d", &ans);
if (ans == -1) exit(0);
v[x][y][z] = ans;
return ans;
}
__attribute__((noreturn))
void guess(int x, int y, int z) {
printf("! %d %d %d\n", x, y, z);
exit(0);
}
void solve(ll n, ll m, ll k, vector<vector<vector<ll>>> &v){
ll lo = 1, mid = (n + 1) / 2, hi = n, a = query(lo, 1, 1, v), b = query(mid, 1, 1, v), c = query(hi, 1, 1, v), range = n / 2;
while(lo < hi){
range /= 2;
if(max({a, b, c}) == b){
lo = max(mid - range, 1), hi = min(mid + range, n), a = query(lo, 1, 1, v), c = query(hi, 1, 1, v);
}
else if(max({a, b, c}) == a){
mid = lo; b = a;
lo = max(mid - range, 1), hi = min(mid + range, n), a = query(lo, 1, 1, v), c = query(hi, 1, 1, v);
}
else{
mid = hi; b = c;
lo = max(mid - range, 1), hi = min(mid + range, n), a = query(lo, 1, 1, v), c = query(hi, 1, 1, v);
}
}
guess(lo, 1, 1);
}
int main() {
int N, M, K, Q;
(void)scanf("%d %d %d %d", &N, &M, &K, &Q);
vector<vector<vector<ll>>> v(N+1, vector<vector<ll>>(M+1, vector<ll>(K+1)));
solve(N, M, K, v);
}