#include <bits/stdc++.h>
using namespace std;
int n;
struct rec {
  int x1, y1, x2, y2;
  rec(){};
};
int BSX1(int x1, int y1, int x2, int y2) {
  int l = x1;
  int r = x2;
  while (r - l > 1) {
    int m = (l + r) / 2;
    printf("? %d %d %d %d\n", m, y1, x2, y2);
    fflush(stdout);
    int o;
    cin >> o;
    if (o > 0)
      l = m;
    else
      r = m;
  }
  printf("? %d %d %d %d\n", r, y1, x2, y2);
  fflush(stdout);
  int o;
  cin >> o;
  if (o > 0)
    return r;
  else
    return l;
}
int BSX2(int x1, int y1, int x2, int y2) {
  int l = x1;
  int r = x2;
  while (r - l > 1) {
    int m = (l + r) / 2;
    printf("? %d %d %d %d\n", x1, y1, m, y2);
    fflush(stdout);
    int o;
    cin >> o;
    if (o > 0)
      r = m;
    else
      l = m;
  }
  printf("? %d %d %d %d\n", x1, y1, l, y2);
  fflush(stdout);
  int o;
  cin >> o;
  if (o > 0)
    return l;
  else
    return r;
}
int BSY1(int x1, int y1, int x2, int y2) {
  int l = y1;
  int r = y2;
  while (r - l > 1) {
    int m = (l + r) / 2;
    printf("? %d %d %d %d\n", x1, m, x2, y2);
    fflush(stdout);
    int o;
    cin >> o;
    if (o > 0)
      l = m;
    else
      r = m;
  }
  printf("? %d %d %d %d\n", x1, r, x2, y2);
  fflush(stdout);
  int o;
  cin >> o;
  if (o > 0)
    return r;
  else
    return l;
}
int BSY2(int x1, int y1, int x2, int y2) {
  int l = y1;
  int r = y2;
  while (r - l > 1) {
    int m = (l + r) / 2;
    printf("? %d %d %d %d\n", x1, y1, x2, m);
    fflush(stdout);
    int o;
    cin >> o;
    if (o > 0)
      r = m;
    else
      l = m;
  }
  printf("? %d %d %d %d\n", x1, y1, x2, l);
  fflush(stdout);
  int o;
  cin >> o;
  if (o > 0)
    return l;
  else
    return r;
}
rec findRec(int x1, int y1, int x2, int y2) {
  rec ans;
  ans.x1 = BSX1(x1, y1, x2, y2);
  ans.x2 = BSX2(ans.x1, y1, x2, y2);
  ans.y1 = BSY1(ans.x1, y1, ans.x2, y2);
  ans.y2 = BSY2(ans.x1, ans.y1, ans.x2, y2);
  return ans;
}
int main() {
  cin >> n;
  rec ans1 = findRec(1, 1, n, n);
  if (ans1.x1 > 1) {
    printf("? %d %d %d %d\n", 1, 1, ans1.x1 - 1, n);
    fflush(stdout);
    int o;
    cin >> o;
    if (o == 1) {
      rec ans2 = findRec(1, 1, ans1.x1 - 1, n);
      printf("! %d %d %d %d %d %d %d %d\n", ans1.x1, ans1.y1, ans1.x2, ans1.y2,
             ans2.x1, ans2.y1, ans2.x2, ans2.y2);
      fflush(stdout);
      return 0;
    }
  }
  if (ans1.x2 < n) {
    printf("? %d %d %d %d\n", ans1.x2 + 1, 1, n, n);
    fflush(stdout);
    int o;
    cin >> o;
    if (o == 1) {
      rec ans2 = findRec(ans1.x2 + 1, 1, n, n);
      printf("! %d %d %d %d %d %d %d %d\n", ans1.x1, ans1.y1, ans1.x2, ans1.y2,
             ans2.x1, ans2.y1, ans2.x2, ans2.y2);
      fflush(stdout);
      return 0;
    }
  }
  if (ans1.y1 > 1) {
    printf("? %d %d %d %d\n", 1, 1, n, ans1.y1 - 1);
    fflush(stdout);
    int o;
    cin >> o;
    if (o == 1) {
      rec ans2 = findRec(1, 1, n, ans1.y1 - 1);
      printf("! %d %d %d %d %d %d %d %d\n", ans1.x1, ans1.y1, ans1.x2, ans1.y2,
             ans2.x1, ans2.y1, ans2.x2, ans2.y2);
      fflush(stdout);
      return 0;
    }
  }
  if (ans1.y2 < n) {
    printf("? %d %d %d %d\n", 1, ans1.y2 + 1, n, n);
    fflush(stdout);
    int o;
    cin >> o;
    if (o == 1) {
      rec ans2 = findRec(1, ans1.y2 + 1, n, n);
      printf("! %d %d %d %d %d %d %d %d\n", ans1.x1, ans1.y1, ans1.x2, ans1.y2,
             ans2.x1, ans2.y1, ans2.x2, ans2.y2);
      fflush(stdout);
      return 0;
    }
  }
  return 0;
}
