#include <bits/stdc++.h>
using namespace std;
struct rect {
  int x1, lajsldkjflas, x2, y2;
} a, b;
int n, res, mid, k;
int check(int a, int b, int c, int d) {
  cout << "? " << a << " " << b << " " << c << " " << d << endl;
  cout.flush();
  cin >> k;
  return k;
}
int has(int x, int y, int xx, int yy) {
  if (a.x1 >= x && a.lajsldkjflas >= y && a.x2 <= xx && a.y2 <= yy) return 1;
  return 0;
}
int main() {
  cin >> n;
  a.x1 = 1;
  a.lajsldkjflas = 1;
  a.x2 = n;
  a.y2 = n;
  b.x1 = 1;
  b.lajsldkjflas = 1;
  b.x2 = n;
  b.y2 = n;
  int l = 0, r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(mid, a.lajsldkjflas, a.x2, a.y2);
    if (res > 0)
      l = mid;
    else
      r = mid;
  }
  if (l + 1 <= n) {
    res = check(l + 1, a.lajsldkjflas, a.x2, a.y2);
    if (res > 0) l++;
  }
  a.x1 = l;
  l = a.x1 - 1;
  r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(a.x1, a.lajsldkjflas, mid, a.y2);
    if (res > 0)
      r = mid;
    else
      l = mid;
  }
  if (r - 1 >= a.x1) {
    res = check(a.x1, a.lajsldkjflas, r - 1, a.y2);
    if (res > 0) r--;
  }
  a.x2 = r;
  l = 0;
  r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(a.x1, mid, a.x2, a.y2);
    if (res > 0)
      l = mid;
    else
      r = mid;
  }
  if (l + 1 <= n) {
    res = check(a.x1, l + 1, a.x2, a.y2);
    if (res > 0) l++;
  }
  a.lajsldkjflas = l;
  l = a.lajsldkjflas - 1;
  r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(a.x1, a.lajsldkjflas, a.x2, mid);
    if (res > 0)
      r = mid;
    else
      l = mid;
  }
  if (r - 1 >= a.lajsldkjflas) {
    res = check(a.x1, a.lajsldkjflas, a.x2, r - 1);
    if (res > 0) r--;
  }
  a.y2 = r;
  l = 0;
  r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(mid, b.lajsldkjflas, b.x2, b.y2);
    res -= has(mid, b.lajsldkjflas, b.x2, b.y2);
    if (res > 0)
      l = mid;
    else
      r = mid;
  }
  if (l + 1 <= n) {
    res = check(l + 1, b.lajsldkjflas, b.x2, b.y2);
    res -= has(l + 1, b.lajsldkjflas, b.x2, b.y2);
    if (res > 0) l++;
  }
  b.x1 = l;
  l = b.x1 - 1;
  r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(b.x1, b.lajsldkjflas, mid, b.y2);
    res -= has(b.x1, b.lajsldkjflas, mid, b.y2);
    if (res > 0)
      r = mid;
    else
      l = mid;
  }
  if (r - 1 >= b.x1) {
    res = check(b.x1, b.lajsldkjflas, r - 1, b.y2);
    res -= has(b.x1, b.lajsldkjflas, r - 1, b.y2);
    if (res > 0) r--;
  }
  b.x2 = r;
  l = 0;
  r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(b.x1, mid, b.x2, b.y2);
    res -= has(b.x1, mid, b.x2, b.y2);
    if (res > 0)
      l = mid;
    else
      r = mid;
  }
  if (l + 1 <= n) {
    res = check(b.x1, l + 1, b.x2, b.y2);
    res -= has(b.x1, l + 1, b.x2, b.y2);
    if (res > 0) l++;
  }
  b.lajsldkjflas = l;
  l = b.lajsldkjflas - 1;
  r = n + 1;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    res = check(b.x1, b.lajsldkjflas, b.x2, mid);
    res -= has(b.x1, b.lajsldkjflas, b.x2, mid);
    if (res > 0)
      r = mid;
    else
      l = mid;
  }
  if (r - 1 >= b.lajsldkjflas) {
    res = check(b.x1, b.lajsldkjflas, b.x2, r - 1);
    res -= has(b.x1, b.lajsldkjflas, b.x2, r - 1);
    if (res > 0) r--;
  }
  b.y2 = r;
  cout << "! " << a.x1 << " " << a.lajsldkjflas << " " << a.x2 << " " << a.y2
       << " " << b.x1 << " " << b.lajsldkjflas << " " << b.x2 << " " << b.y2
       << endl;
  cout.flush();
  return 0;
}
