#include <bits/stdc++.h>
using namespace std;
template <class T>
T min(T a, T b, T c) {
  return min(a, min(b, c));
}
template <class T>
T max(T a, T b, T c) {
  return max(a, max(b, c));
}
int n;
vector<int> ansX1, ansY1, ansX2, ansY2;
int ask(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int ans;
  scanf("%d", &ans);
  return ans;
}
bool isIn(int l, int x, int r) { return (l <= x && x <= r); }
void solve() {
  int x1 = 1, y1 = 1, x2 = n, y2 = n;
  int l = x1, r = x2, res = l - 1;
  while (l <= r) {
    int mid = (l + r) / 2;
    int x = ask(x1, y1, mid, y2);
    for (int i = (0); i <= ((int)ansX1.size() - 1); ++i) {
      if (isIn(x1, ansX1[i], mid) && isIn(x1, ansX2[i], mid) &&
          isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2))
        --x;
    }
    if (x == 0) {
      res = max(res, mid);
      l = mid + 1;
    } else
      r = mid - 1;
  }
  x2 = res + 1;
  l = x1, r = x2, res = r + 1;
  while (l <= r) {
    int mid = (l + r) / 2;
    int x = ask(mid, y1, x2, y2);
    for (int i = (0); i <= ((int)ansX1.size() - 1); ++i) {
      if (isIn(mid, ansX1[i], x2) && isIn(mid, ansX2[i], x2) &&
          isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2))
        --x;
    }
    if (x == 0) {
      res = min(res, mid);
      r = mid - 1;
    } else
      l = mid + 1;
  }
  x1 = res - 1;
  l = y1, r = y2, res = l - 1;
  while (l <= r) {
    int mid = (l + r) / 2;
    int x = ask(x1, y1, x2, mid);
    for (int i = (0); i <= ((int)ansX1.size() - 1); ++i) {
      if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) &&
          isIn(y1, ansY1[i], mid) && isIn(y1, ansY2[i], mid))
        --x;
    }
    if (x == 0) {
      res = max(res, mid);
      l = mid + 1;
    } else
      r = mid - 1;
  }
  y2 = res + 1;
  l = y1, r = y2, res = r + 1;
  while (l <= r) {
    int mid = (l + r) / 2;
    int x = ask(x1, mid, x2, y2);
    for (int i = (0); i <= ((int)ansX1.size() - 1); ++i) {
      if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) &&
          isIn(mid, ansY1[i], y2) && isIn(mid, ansY2[i], y2))
        --x;
    }
    if (x == 0) {
      res = min(res, mid);
      r = mid - 1;
    } else
      l = mid + 1;
  }
  y1 = res - 1;
  ansX1.push_back(x1);
  ansY1.push_back(y1);
  ansX2.push_back(x2);
  ansY2.push_back(y2);
}
int main() {
  scanf("%d", &n);
  for (int i = (1); i <= (2); ++i) solve();
  printf("!");
  for (int i = (0); i <= (1); ++i)
    printf(" %d %d %d %d", ansX1[i], ansY1[i], ansX2[i], ansY2[i]);
  return 0;
}
