#include <bits/stdc++.h>
using namespace std;
int points[8];
int n;
int base, top, middle, num, aux;
void FindRect(int s, int i, int b, int d, int x) {
  top = b + 1;
  base = s - 1;
  while (top - base != 1) {
    middle = (top + base) / 2;
    cout << "?" << middle << " " << i << " " << b << " " << d << "\n";
    flush(cout);
    cin >> aux;
    if (aux == 1)
      swap(base, middle);
    else
      swap(middle, top);
  }
  s = base;
  base = i - 1;
  top = d + 1;
  while (top - base != 1) {
    middle = (top + base) / 2;
    cout << "?" << s << " " << middle << " " << b << " " << d << "\n";
    flush(cout);
    cin >> aux;
    if (aux == 1)
      swap(base, middle);
    else
      swap(middle, top);
  }
  i = base;
  base = i - 1;
  top = d + 1;
  while (top - base != 1) {
    middle = (top + base) / 2;
    cout << "?" << s << " " << i << " " << b << " " << middle << "\n";
    flush(cout);
    cin >> aux;
    if (aux == 1)
      swap(top, middle);
    else
      swap(middle, base);
  }
  d = top;
  base = s - 1;
  top = b + 1;
  while (top - base != 1) {
    middle = (top + base) / 2;
    cout << "? " << s << " " << i << " " << middle << " " << d << "\n";
    flush(cout);
    cin >> aux;
    if (aux == 1)
      swap(top, middle);
    else
      swap(middle, base);
  }
  b = top;
  points[x] = s;
  points[x + 1] = i;
  points[x + 2] = b;
  points[x + 3] = d;
}
int main() {
  cin >> n;
  base = 0;
  top = n + 1;
  while (top - base != 1) {
    middle = (top + base) / 2;
    cout << "?" << 1 << " " << middle << " " << n << " " << n << "\n";
    flush(cout);
    cin >> aux;
    if (aux >= 1)
      swap(base, middle);
    else
      swap(middle, top);
  }
  if (base != 1) {
    cout << "?" << 1 << " " << 1 << " " << n << " " << base - 1 << "\n";
    flush(cout);
    cin >> aux;
    if (aux == 1) {
      num = base;
      FindRect(1, 1, n, num - 1, 0);
      FindRect(1, num, n, n, 4);
      cout << "! " << points[0] << " " << points[1] << " " << points[2] << " "
           << points[3] << " " << points[4] << " " << points[5] << " "
           << points[6] << " " << points[7] << "\n";
      flush(cout);
      return 0;
    }
  }
  base = 0;
  top = n + 1;
  num = 2;
  while (top - base != 1) {
    middle = (top + base) / 2;
    cout << "?" << middle << " " << 1 << " " << n << " " << n << "\n";
    flush(cout);
    cin >> aux;
    if (aux >= 1)
      swap(base, middle);
    else
      swap(middle, top);
  }
  num = base;
  FindRect(1, 1, num - 1, n, 0);
  FindRect(num, 1, n, n, 4);
  cout << "! " << points[0] << " " << points[1] << " " << points[2] << " "
       << points[3] << " " << points[4] << " " << points[5] << " " << points[6]
       << " " << points[7] << "\n";
  flush(cout);
  return 0;
}
