#include <bits/stdc++.h>
using namespace std;
int a[4], b[4], n;
int query(int *A) {
  int i;
  cout << "? ";
  for (i = 0; i < 3; ++i) cout << A[i] << " ";
  cout << A[3] << endl;
  fflush(stdout);
  cin >> i;
  return i;
}
int query(int x1, int y1, int x2, int y2) {
  if (x1 > x2 || y1 > y2) return 0;
  cout << "? ";
  cout << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  fflush(stdout);
  b[0] = x1, b[1] = y1, b[2] = x2, b[3] = y2;
  int r;
  cin >> r;
  return r;
}
void print(int *x) {
  int i;
  for (i = 0; i < 4; ++i) cout << x[i] << " ";
}
void up(int *A, int x) {
  int l = A[x], r = A[x + 2], mid;
  while (l < r) {
    mid = (l + r) / 2;
    A[x + 2] = mid;
    if (query(A))
      r = mid;
    else
      l = mid + 1;
  }
  A[x + 2] = l;
}
void dw(int *A, int x) {
  int l = A[x], r = A[x + 2], m;
  while (l < r) {
    m = (l + r + 1) / 2;
    A[x] = m;
    if (query(A))
      l = m;
    else
      r = m - 1;
  }
  A[x] = l;
}
void solve(int *A) {
  up(A, 0);
  dw(A, 0);
  up(A, 1);
  dw(A, 1);
}
int main() {
  cin >> n;
  a[0] = 1, a[1] = 1, a[2] = n, a[3] = n;
  solve(a);
  int x1, x2, y1, y2;
  if (a[0] != 1 && query(1, 1, a[0] - 1, n))
    ;
  else if (a[2] + 1 <= n && query(a[2] + 1, 1, n, n))
    ;
  else if (a[1] != 1 && query(1, 1, n, a[1] - 1))
    ;
  else if (a[3] + 1 <= n && query(1, a[3] + 1, n, n))
    ;
  solve(b);
  cout << "! ";
  print(a);
  print(b);
  cout << endl;
  fflush(stdout);
}
