#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
typedef pair<ll, pii> ppi;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpii;
void umin(ll &x, ll y) { x = min(x, y); }
void umax(ll &x, ll y) { x = max(x, y); }
class rect {
 public:
  ll x[2];
  ll y[2];
  void print_rect() {
    cout << x[0] << " " << y[0] << " " << x[1] << " " << y[1] << endl;
    cout << flush;
  }
  rect(ll n) {
    x[0] = y[0] = 1;
    x[1] = y[1] = n;
  }
};
void bsearch_first(ll *upd, rect &r1, ll n) {
  ll res;
  ll start = upd[0], end = upd[1];
  while (start < end) {
    ll mid = (start + end + 1) / 2;
    upd[0] = mid;
    cout << "? ";
    r1.print_rect();
    cin >> res;
    if (start == end - 1) {
      if (res == 0)
        end = start;
      else
        start = end;
      break;
    }
    if (res == 0) {
      end = mid;
    } else {
      start = mid;
    }
  }
  upd[0] = start;
}
void bsearch_second(ll *upd, rect &r1, ll n) {
  ll res;
  ll start = upd[0], end = upd[1];
  while (start < end) {
    ll mid = (start + end) / 2;
    upd[1] = mid;
    cout << "? ";
    r1.print_rect();
    cin >> res;
    if (start == end - 1) {
      if (res == 0)
        start = end;
      else
        end = start;
      break;
    }
    if (res == 0) {
      start = mid;
    } else {
      end = mid;
    }
  }
  upd[1] = start;
}
void bsearch(ll *upd, rect &r1, ll n) {
  bsearch_first(upd, r1, n);
  bsearch_second(upd, r1, n);
}
int main() {
  std::ios::sync_with_stdio(false);
  ll n;
  cin >> n;
  rect r1(n);
  rect r2(n);
  bsearch(r1.x, r1, n);
  bsearch(r1.y, r1, n);
  int res;
  rect rx1(n);
  rx1.x[0] = r1.x[1] + 1;
  if (rx1.x[0] <= n) {
    cout << "? ";
    rx1.print_rect();
    cin >> res;
    if (res == 1) {
      r2.x[0] = rx1.x[0];
    }
  }
  rect rx2(n);
  rx2.x[1] = r1.x[0] - 1;
  if (rx2.x[1] > 0) {
    cout << "? ";
    rx2.print_rect();
    cin >> res;
    if (res == 1) {
      r2.x[1] = rx2.x[1];
    }
  }
  rect ry1(n);
  ry1.y[0] = r1.y[1] + 1;
  if (ry1.y[0] <= n) {
    cout << "? ";
    ry1.print_rect();
    cin >> res;
    if (res == 1) {
      r2.y[0] = ry1.y[0];
    }
  }
  rect ry2(n);
  ry2.y[1] = r1.y[0] - 1;
  if (ry2.y[1] > 0) {
    cout << "? ";
    ry2.print_rect();
    cin >> res;
    if (res == 1) {
      r2.y[1] = ry2.y[1];
    }
  }
  bsearch(r2.x, r2, n);
  bsearch(r2.y, r2, n);
  cout << "! ";
  r1.print_rect();
  r2.print_rect();
  return 0;
}
