#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const double PI = 3.1415926535897932384626433832795;
const double eps = 1e-9;
const int null = 10000;
int n, X1, X2, Y1, Y2;
map<vector<int>, int> mp;
int ask(int a1, int b1, int a2, int b2) {
  int x;
  vector<int> p(4);
  p[0] = a1;
  p[1] = b1;
  p[2] = a2;
  p[3] = b2;
  if (mp.find(p) != mp.end()) return mp[p];
  printf("? %d %d %d %d\n", a1, b1, a2, b2);
  fflush(stdout);
  scanf("%d", &x);
  mp[p] = x;
  return x;
}
int hack(int a1, int b1, int a2, int b2) {
  if (a1 <= X1 && a2 >= X2 && b1 <= Y1 && b2 >= Y2) return 1;
  return 0;
}
int hask(int a1, int b1, int a2, int b2) {
  int x;
  vector<int> p(4);
  p[0] = a1;
  p[1] = b1;
  p[2] = a2;
  p[3] = b2;
  if (mp.find(p) != mp.end()) return mp[p] - hack(a1, b1, a2, b2);
  printf("? %d %d %d %d\n", a1, b1, a2, b2);
  fflush(stdout);
  scanf("%d", &x);
  mp[p] = x;
  return x - hack(a1, b1, a2, b2);
}
void sol() {
  int x, l, r, m, bot1, top1, l1, r1;
  scanf("%d", &n);
  l = 1;
  r = n;
  while (r - l > 1) {
    m = (l + r) / 2;
    if (ask(1, m, n, n) == 0)
      r = m;
    else
      l = m;
  }
  if (ask(1, r, n, n) != 0) l = r;
  bot1 = l;
  l = 1;
  r = n;
  while (r - l > 1) {
    m = (l + r) / 2;
    if (ask(1, bot1, m, n) != 0)
      r = m;
    else
      l = m;
  }
  if (ask(1, bot1, l, n) != 0) r = l;
  r1 = r;
  l = bot1;
  r = n;
  while (r - l > 1) {
    m = (l + r) / 2;
    if (ask(1, bot1, r1, m) != 0)
      r = m;
    else
      l = m;
  }
  if (ask(1, bot1, r1, l) != 0) r = l;
  top1 = r;
  l = r1;
  r = 1;
  while (l - r > 1) {
    m = (l + r) / 2;
    if (ask(m, bot1, r1, top1) != 0)
      r = m;
    else
      l = m;
  }
  if (ask(l, bot1, r1, top1) != 0) r = l;
  l1 = r;
  X1 = l1;
  X2 = r1;
  Y1 = bot1;
  Y2 = top1;
  l = 1;
  r = n;
  while (r - l > 1) {
    m = (l + r) / 2;
    if (hask(1, m, n, n) == 0)
      r = m;
    else
      l = m;
  }
  if (hask(1, r, n, n) > 0) l = r;
  bot1 = l;
  l = 1;
  r = n;
  while (r - l > 1) {
    m = (l + r) / 2;
    if (hask(1, bot1, m, n) > 0)
      r = m;
    else
      l = m;
  }
  if (hask(1, bot1, l, n) > 0) r = l;
  r1 = r;
  l = bot1;
  r = n;
  while (r - l > 1) {
    m = (l + r) / 2;
    if (hask(1, bot1, r1, m) > 0)
      r = m;
    else
      l = m;
  }
  if (hask(1, bot1, r1, l) > 0) r = l;
  top1 = r;
  l = r1;
  r = 1;
  while (l - r > 1) {
    m = (l + r) / 2;
    if (hask(m, bot1, r1, top1) > 0)
      r = m;
    else
      l = m;
  }
  if (hask(l, bot1, r1, top1) > 0) r = l;
  l1 = r;
  printf("! %d %d %d %d %d %d %d %d\n", X1, Y1, X2, Y2, l1, bot1, r1, top1);
  fflush(stdout);
}
int main() {
#pragma comment(linker, "/STACK:268435456")
  sol();
  return 0;
}
