#include <bits/stdc++.h>
using namespace std;
int n;
int query(int x1, int y1, int x2, int y2) {
  if (x1 > x2 || y1 > y2) return 0;
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int ans;
  scanf("%d", &ans);
  return ans;
}
int get_right(int x1, int y1, int x2, int y2) {
  int left = x1 - 1, right = x2;
  while (right - left > 1) {
    int mid = (left + right) / 2;
    if (query(x1, y1, mid, y2) == 1)
      right = mid;
    else
      left = mid;
  }
  return right;
}
int get_left(int x1, int y1, int x2, int y2) {
  int left = x1, right = x2 + 1;
  while (right - left > 1) {
    int mid = (left + right) / 2;
    if (query(mid, y1, x2, y2) == 1)
      left = mid;
    else
      right = mid;
  }
  return left;
}
int get_up(int x1, int y1, int x2, int y2) {
  int left = y1 - 1, right = y2;
  while (right - left > 1) {
    int mid = (left + right) / 2;
    if (query(x1, y1, x2, mid) == 1)
      right = mid;
    else
      left = mid;
  }
  return right;
}
int get_down(int x1, int y1, int x2, int y2) {
  int left = y1, right = y2 + 1;
  while (right - left > 1) {
    int mid = (left + right) / 2;
    if (query(x1, mid, x2, y2) == 1)
      left = mid;
    else
      right = mid;
  }
  return left;
}
bool solve_x() {
  int left = 0, right = n;
  while (right - left > 1) {
    int mid = (left + right) / 2;
    if (query(1, 1, mid, n) > 0)
      right = mid;
    else
      left = mid;
  }
  if (query(right + 1, 1, n, n) != 1) return false;
  int L1 = get_left(1, 1, right, n);
  int R1 = get_right(1, 1, right, n);
  int D1 = get_down(1, 1, right, n);
  int U1 = get_up(1, 1, right, n);
  int L2 = get_left(right + 1, 1, n, n);
  int R2 = get_right(right + 1, 1, n, n);
  int D2 = get_down(right + 1, 1, n, n);
  int U2 = get_up(right + 1, 1, n, n);
  printf("! %d %d %d %d %d %d %d %d\n", L1, D1, R1, U1, L2, D2, R2, U2);
  fflush(stdout);
  return true;
}
bool solve_y() {
  int left = 0, right = n;
  while (right - left > 1) {
    int mid = (left + right) / 2;
    if (query(1, 1, n, mid) > 0)
      right = mid;
    else
      left = mid;
  }
  if (query(1, right + 1, n, n) != 1) return false;
  int L1 = get_left(1, 1, n, right);
  int R1 = get_right(1, 1, n, right);
  int D1 = get_down(1, 1, n, right);
  int U1 = get_up(1, 1, n, right);
  int L2 = get_left(1, right + 1, n, n);
  int R2 = get_right(1, right + 1, n, n);
  int D2 = get_down(1, right + 1, n, n);
  int U2 = get_up(1, right + 1, n, n);
  printf("! %d %d %d %d %d %d %d %d\n", L1, D1, R1, U1, L2, D2, R2, U2);
  fflush(stdout);
  return true;
}
void solve() {
  scanf("%d", &n);
  if (!solve_x())
    if (!solve_y()) throw;
}
int main() {
  solve();
  0;
}
