#include <bits/stdc++.h>
using namespace std;
int a, b, c, d;
int e, f, g, h;
int ask1(int x1, int y1, int x2, int y2) {
  int s = 0;
  s += x1 <= a && y1 <= b && x2 >= c && y2 >= d;
  s += x1 <= e && y1 <= f && x2 >= g && y2 >= h;
  return s;
}
int ask(int x1, int y1, int x2, int y2) {
  ++x1, ++y1;
  if (x1 > x2 || y1 > y2) return 0;
  cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  cout << flush;
  int t;
  cin >> t;
  return t;
}
int n;
void getBounds(vector<int>& res, function<int(int)> f) {
  int l = 0, r = n;
  ;
  ;
  while (r - l > 1) {
    int m = (r + l) / 2;
    if (f(m) == 2) {
      r = m;
    } else {
      l = m;
    }
  }
  res.push_back(r);
  if (f(l) == 1) {
    r = l;
    l = 0;
    ;
    ;
    while (r - l > 1) {
      int m = (r + l) / 2;
      if (f(m) == 1) {
        r = m;
      } else {
        l = m;
      }
    }
    res.push_back(r);
  }
}
void solve() {
  vector<int> X1;
  vector<int> Y1;
  vector<int> X2;
  vector<int> Y2;
  getBounds(X2, [](int x) { return ask(0, 0, x, n); });
  getBounds(X1, [](int x) { return ask(n - x, 0, n, n); });
  getBounds(Y2, [](int y) { return ask(0, 0, n, y); });
  getBounds(Y1, [](int y) { return ask(0, n - y, n, n); });
  for (auto& x : X1) x = n - x;
  for (auto& x : Y1) x = n - x;
  sort((X1).begin(), (X1).end());
  X1.erase(unique((X1).begin(), (X1).end()), X1.end());
  sort((X2).begin(), (X2).end());
  X2.erase(unique((X2).begin(), (X2).end()), X2.end());
  sort((Y1).begin(), (Y1).end());
  Y1.erase(unique((Y1).begin(), (Y1).end()), Y1.end());
  sort((Y2).begin(), (Y2).end());
  Y2.erase(unique((Y2).begin(), (Y2).end()), Y2.end());
  vector<pair<pair<int, int>, pair<int, int>>> ok;
  for (auto x1 : X1)
    for (auto x2 : X2)
      if (x2 > x1) {
        for (auto y1 : Y1)
          for (auto y2 : Y2)
            if (y2 > y1) {
              if (ask(x1, y1, x2, y2) == 1) {
                ok.push_back({{x1, y1}, {x2, y2}});
              }
            }
      }
  cout << "! ";
  for (auto kv : ok) {
    int x1, y1, x2, y2;
    tie(x1, y1) = kv.first;
    tie(x2, y2) = kv.second;
    bool good = true;
    for (auto kv2 : ok)
      if (kv != kv2) {
        int X1, Y1, X2, Y2;
        tie(X1, Y1) = kv2.first;
        tie(X2, Y2) = kv2.second;
        if (X1 >= x1 && Y1 >= y1 && X2 <= x2 && Y2 <= y2) {
          good = false;
        }
      }
    if (good) {
      cout << x1 + 1 << " " << y1 + 1 << " " << x2 << " " << y2 << " ";
    }
  }
  cout << endl;
}
int main() {
  cin >> n;
  solve();
  return 0;
}
