#include <bits/stdc++.h>
using namespace std;
const long long cls = 1000000007;
const int INF = 0x3f3f3f3f;
using namespace std;
int n;
struct rec {
  int x1, y1, x2, y2;
  rec(int a, int b, int c, int d) : x1(a), y1(b), x2(c), y2(d) {}
};
vector<rec> fuckk;
int Q(int x1, int y1, int x2, int y2) {
  if (x1 > x2 || y1 > y2) return 0;
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int ans;
  scanf("%d", &ans);
  return ans;
}
void fuck() {
  int x = 0, y = n + 1, mid;
  while (x < y) {
    mid = x + (y - x) / 2;
    int ans1 = Q(1, 1, mid, n);
    int ans2 = Q(1 + mid, 1, n, n);
    if (ans1 == 1 && ans2 == 1) {
      fuckk.push_back(rec(1, 1, mid, n));
      fuckk.push_back(rec(mid + 1, 1, n, n));
      return;
    } else if (ans1 == 0 && ans2 == 0) {
      break;
    } else if (ans1) {
      y = mid;
    } else if (ans2) {
      x = mid + 1;
    }
  }
  x = 0, y = n + 1;
  while (x < y) {
    mid = x + (y - x) / 2;
    int ans1 = Q(1, 1, n, mid);
    int ans2 = Q(1, 1 + mid, n, n);
    if (ans1 == 1 && ans2 == 1) {
      fuckk.push_back(rec(1, 1, n, mid));
      fuckk.push_back(rec(1, 1 + mid, n, n));
      return;
    } else if (ans1 == 0 && ans2 == 0) {
      break;
    } else if (ans1) {
      y = mid;
    } else if (ans2) {
      x = mid + 1;
    }
  }
}
void solve(int x1, int y1, int x2, int y2) {
  int u, d, l, r;
  int x, y, mid;
  x = 0, y = y2 - y1 + 2;
  while (x < y) {
    mid = x + (y - x) / 2;
    int ans = Q(x1, y1, x2, y1 + mid - 1);
    if (ans == 1) {
      y = mid;
    } else {
      x = mid + 1;
    }
  }
  u = y1 + x - 1;
  x = 0, y = y2 - y1 + 2;
  while (x < y) {
    mid = x + (y - x) / 2;
    int ans = Q(x1, y1 + mid, x2, y2);
    if (ans == 0) {
      y = mid;
    } else {
      x = mid + 1;
    }
  }
  d = y1 + x - 1;
  x = 0, y = x2 - x1 + 2;
  while (x < y) {
    mid = x + (y - x) / 2;
    int ans = Q(x1 + mid, y1, x2, y2);
    if (ans == 0) {
      y = mid;
    } else {
      x = mid + 1;
    }
  }
  l = x1 + x - 1;
  x = 0, y = x2 - x1 + 2;
  while (x < y) {
    mid = x + (y - x) / 2;
    int ans = Q(x1, y1, x1 + mid - 1, y2);
    if (ans == 1) {
      y = mid;
    } else {
      x = mid + 1;
    }
  }
  r = x1 + x - 1;
  fuckk.push_back(rec(l, d, r, u));
}
int main() {
  scanf("%d", &n);
  fuck();
  solve(fuckk[0].x1, fuckk[0].y1, fuckk[0].x2, fuckk[0].y2);
  solve(fuckk[1].x1, fuckk[1].y1, fuckk[1].x2, fuckk[1].y2);
  printf("! %d %d %d %d %d %d % d %d\n", fuckk[2].x1, fuckk[2].y1, fuckk[2].x2,
         fuckk[2].y2, fuckk[3].x1, fuckk[3].y1, fuckk[3].x2, fuckk[3].y2);
  fflush(stdout);
  return 0;
}
