#include <bits/stdc++.h>
int n;
struct Rect {
  int x1, y1, x2, y2;
};
int check(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int ret;
  scanf("%d", &ret);
  return ret;
}
Rect getRect(int x1, int y1, int x2, int y2) {
  Rect ret;
  int l, r;
  l = x1, r = x2;
  while (l < r) {
    int m = (l + r) >> 1;
    if (check(x1, y1, m, y2) < 1)
      l = m + 1;
    else
      r = m;
  }
  ret.x2 = l;
  l = y1, r = y2;
  while (l < r) {
    int m = (l + r) >> 1;
    if (check(x1, y1, x2, m) < 1)
      l = m + 1;
    else
      r = m;
  }
  ret.y2 = l;
  l = x1, r = x2;
  while (l < r) {
    int m = (l + r + 1) >> 1;
    if (check(m, y1, x2, y2) < 1)
      r = m - 1;
    else
      l = m;
  }
  ret.x1 = l;
  l = y1, r = y2;
  while (l < r) {
    int m = (l + r + 1) >> 1;
    if (check(x1, m, x2, y2) < 1)
      r = m - 1;
    else
      l = m;
  }
  ret.y1 = l;
  return ret;
}
int main() {
  scanf("%d", &n);
  int l = 1, r = n;
  while (l < r) {
    int m = (l + r) >> 1;
    if (check(1, 1, m, n) < 1)
      l = m + 1;
    else
      r = m;
  }
  if (check(1, 1, l, n) == 1 && check(l + 1, 1, n, n) == 1) {
    Rect r1 = getRect(1, 1, l, n);
    Rect r2 = getRect(l + 1, 1, n, n);
    printf("! %d %d %d %d %d %d %d %d\n", r1.x1, r1.y1, r1.x2, r1.y2, r2.x1,
           r2.y1, r2.x2, r2.y2);
    return 0;
  }
  l = 1, r = n;
  while (l < r) {
    int m = (l + r) >> 1;
    if (check(1, 1, n, m) < 1)
      l = m + 1;
    else
      r = m;
  }
  Rect r1 = getRect(1, 1, n, l);
  Rect r2 = getRect(1, l + 1, n, n);
  printf("! %d %d %d %d %d %d %d %d\n", r1.x1, r1.y1, r1.x2, r1.y2, r2.x1,
         r2.y1, r2.x2, r2.y2);
  return 0;
}
