#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
};
Point operator+(const Point& a, const Point& b) {
  return {a.x + b.x, a.y + b.y};
}
Point operator*(const Point& a, const int k) { return {k * a.x, k * a.y}; }
bool in(const Point& a, const Point& b, const Point& c, const Point& d) {
  if (c.x <= a.x and c.y <= a.y and d.x >= b.x and d.y >= b.y) return true;
  return false;
}
const Point table[] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int guess(int type, const Point& A, const Point& B, const Point& G,
          const Point& H) {
  Point C{0, 0}, D{0, 0};
  (type & 2 ? D : C) = table[type];
  int l = 0, r = (type & 1 ? B.y - A.y : B.x - A.x);
  while (l < r) {
    int m = (l + r + 1) / 2;
    auto E = A + C * m;
    auto F = B + D * m;
    cout << "? " << E.x << ' ' << E.y << ' ' << F.x << ' ' << F.y << endl;
    int fb;
    cin >> fb;
    if (in(G, H, E, F)) --fb;
    if (fb == 0)
      r = m - 1;
    else
      l = m;
  }
  switch (type) {
    case 0:
      return A.x + C.x * l;
    case 1:
      return A.y + C.y * l;
    case 2:
      return B.x + D.x * l;
    case 3:
      return B.y + D.y * l;
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  int l1, l2, r1, r2, b1, b2, t1, t2;
  l1 = guess(0, {1, 1}, {n, n}, {0, 0}, {0, 0});
  b1 = guess(1, {l1, 1}, {n, n}, {0, 0}, {0, 0});
  r1 = guess(2, {l1, b1}, {n, n}, {0, 0}, {0, 0});
  t1 = guess(3, {l1, b1}, {r1, n}, {0, 0}, {0, 0});
  l2 = guess(0, {1, 1}, {n, n}, {l1, b1}, {r1, t1});
  b2 = guess(1, {l2, 1}, {n, n}, {l1, b1}, {r1, t1});
  r2 = guess(2, {l2, b2}, {n, n}, {l1, b1}, {r1, t1});
  t2 = guess(3, {l2, b2}, {r2, n}, {l1, b1}, {r1, t1});
  cout << "! " << l1 << ' ' << b1 << ' ' << r1 << ' ' << t1 << ' ' << l2 << ' '
       << b2 << ' ' << r2 << ' ' << t2 << endl;
  return 0;
}
