#include <bits/stdc++.h>
using namespace std;
struct pos {
  int x1, y1, x2, y2;
  void print() { cout << x1 << " " << y1 << " " << x2 << " " << y2 << " "; }
};
int query(int x1, int y1, int x2, int y2) {
  if (x1 > x2) swap(x1, x2);
  if (y1 > y2) swap(y1, y2);
  cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  int ans;
  cin >> ans;
  return ans;
}
pos fi(int x1, int y1, int x2, int y2) {
  pos Ans;
  int l = y1, r = y2, ans = y1, mid;
  while (l <= r) {
    mid = (l + r) / 2;
    if (query(x1, y1, x2, mid) >= 1)
      r = mid - 1, ans = mid;
    else
      l = mid + 1;
  }
  Ans.y2 = ans;
  l = y1, r = ans, ans = y1;
  while (l <= r) {
    mid = (l + r) / 2;
    if (query(x1, mid, x2, y2) >= 1)
      l = mid + 1, ans = mid;
    else
      r = mid - 1;
  }
  Ans.y1 = ans;
  l = x1, r = x2, ans = x1;
  while (l <= r) {
    mid = (l + r) / 2;
    if (query(mid, y1, x2, y2) >= 1)
      l = mid + 1, ans = mid;
    else
      r = mid - 1;
  }
  Ans.x1 = ans;
  l = ans, r = x2, ans = x1;
  while (l <= r) {
    mid = (l + r) / 2;
    if (query(x1, y1, mid, y2) >= 1)
      r = mid - 1, ans = mid;
    else
      l = mid + 1;
  }
  Ans.x2 = ans;
  return Ans;
}
int main() {
  int n;
  scanf("%d", &n);
  int l = 1, r = n, mid, ans = 1;
  while (l <= r) {
    mid = (l + r) / 2;
    if (query(1, 1, mid, n) >= 1)
      r = mid - 1, ans = mid;
    else
      l = mid + 1;
  }
  if (query(1, 1, ans, n) == 1 && query(ans + 1, 1, n, n) == 1) {
    pos r1 = fi(1, 1, ans, n);
    pos r2 = fi(ans + 1, 1, n, n);
    cout << "! ";
    r1.print();
    r2.print();
    return 0;
  }
  l = 1, r = n, ans = 1;
  while (l <= r) {
    mid = (l + r) / 2;
    if (query(1, 1, n, mid) >= 1)
      r = mid - 1, ans = mid;
    else
      l = mid + 1;
  }
  pos r1 = fi(1, 1, n, ans);
  pos r2 = fi(1, ans + 1, n, n);
  cout << "! ";
  r1.print();
  r2.print();
  return 0;
}
