#include <bits/stdc++.h>
using namespace std;
const int N = 300100;
int n;
struct Rectangle {
  int x1, x2, y1, y2;
  Rectangle() {}
  Rectangle(int _x1, int _y1, int _x2, int _y2) {
    x1 = _x1;
    x2 = _x2;
    y1 = _y1;
    y2 = _y2;
  }
  bool operator==(const Rectangle &rhs) const {
    return rhs.x1 == x1 && rhs.x2 == x2 && rhs.y1 == y1 && rhs.y2 == y2;
  }
};
Rectangle ans[2] = {Rectangle(1, 1, 10, 1), Rectangle(5, 5, 5, 10)};
int cnt = 0;
int ask(Rectangle rec) {
  cnt++;
  assert(cnt != 200);
  fflush(stdout);
  printf("? %d %d %d %d\n", rec.x1, rec.y1, rec.x2, rec.y2);
  fflush(stdout);
  int k;
  scanf("%d", &k);
  fflush(stdout);
  return k;
}
pair<int, int> splitX(Rectangle rec) {
  pair<int, int> res;
  int lo = 0, hi = rec.x2 - rec.x1, mid, ans = 1e9;
  while (lo <= hi) {
    mid = (lo + hi) / 2;
    if (ask(Rectangle(rec.x1, rec.y1, rec.x1 + mid, rec.y2))) {
      ans = min(ans, mid);
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  res.first = rec.x1 + ans;
  lo = 0, hi = rec.x2 - rec.x1, mid, ans = 1e9;
  while (lo <= hi) {
    mid = (lo + hi) / 2;
    if (ask(Rectangle(rec.x2 - mid, rec.y1, rec.x2, rec.y2))) {
      ans = min(ans, mid);
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  res.second = rec.x2 - ans;
  return res;
}
pair<int, int> splitY(Rectangle rec) {
  pair<int, int> res;
  int lo = 0, hi = rec.y2 - rec.y1, mid, ans = 1e9;
  while (lo <= hi) {
    mid = (lo + hi) / 2;
    if (ask(Rectangle(rec.x1, rec.y1, rec.x2, rec.y1 + mid))) {
      ans = min(ans, mid);
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  res.first = rec.y1 + ans;
  lo = 0, hi = rec.y2 - rec.y1, mid, ans = 1e9;
  while (lo <= hi) {
    mid = (lo + hi) / 2;
    if (ask(Rectangle(rec.x1, rec.y2 - mid, rec.x2, rec.y2))) {
      ans = min(ans, mid);
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  res.second = rec.y2 - ans;
  return res;
}
Rectangle solve(Rectangle rec) {
  pair<int, int> xx = splitX(rec);
  pair<int, int> yy = splitY(rec);
  return Rectangle(xx.second, yy.second, xx.first, yy.first);
}
void print(Rectangle rec) {
  printf(" %d %d %d %d", rec.x1, rec.y1, rec.x2, rec.y2);
}
int main() {
  scanf("%d", &n);
  Rectangle h1, h2;
  Rectangle rec = Rectangle(1, 1, n, n);
  pair<int, int> xx = splitX(rec);
  pair<int, int> yy = splitY(rec);
  if (xx.first < xx.second) {
    h1 = Rectangle(rec.x1, rec.y1, xx.first, rec.y2);
    h2 = Rectangle(xx.second, rec.y1, rec.x2, rec.y2);
  } else {
    h1 = Rectangle(rec.x1, rec.y1, rec.x2, yy.first);
    h2 = Rectangle(rec.x1, yy.second, rec.x2, rec.y2);
  }
  fflush(stdout);
  vector<Rectangle> res;
  res.push_back(solve(h1));
  res.push_back(solve(h2));
  printf("! %d %d %d %d ", res[0].x1, res[0].y1, res[0].x2, res[0].y2);
  printf("%d %d %d %d\n", res[1].x1, res[1].y1, res[1].x2, res[1].y2);
  fflush(stdout);
  return 0;
}
