#include <bits/stdc++.h>
using namespace std;
int n;
int query_0(int x1, int x2, int y1, int y2, int dim = 0) {
  int rc1[] = {56677, 57096, 37631, 58131};
  int rc2[] = {37503, 53664, 6356, 37172};
  int res = 0;
  if (dim == 0) {
    cout << x1 << " " << x2 << " " << y1 << " " << y2;
    if (rc1[0] >= x1 && rc1[1] <= x2 && rc1[2] >= y1 && rc1[3] <= y2) {
      ++res;
    }
    if (rc2[0] >= x1 && rc2[1] <= x2 && rc2[2] >= y1 && rc2[3] <= y2) {
      ++res;
    }
  } else {
    cout << y1 << " " << y2 << " " << x1 << " " << x2;
    if (rc1[0] >= y1 && rc1[1] <= y2 && rc1[2] >= x1 && rc1[3] <= x2) {
      ++res;
    }
    if (rc2[0] >= y1 && rc2[1] <= y2 && rc2[2] >= x1 && rc2[3] <= x2) {
      ++res;
    }
  }
  cout << " " << res << endl;
  return res;
}
int query(int x1, int x2, int y1, int y2, int dim = 0) {
  cout << "? ";
  if (dim == 0) {
    cout << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  } else {
    cout << y1 << " " << x1 << " " << y2 << " " << x2 << endl;
  }
  fflush(stdout);
  int r;
  cin >> r;
  return r;
}
void shrink_rect(int &x1, int &x2, int &y1, int &y2) {
  int low, high;
  low = x1, high = x2;
  while (low <= high) {
    int mid = (low + high) / 2;
    if (query(x1, mid, y1, y2) == 1) {
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  x2 = low;
  low = x1, high = x2;
  while (low <= high) {
    int mid = (low + high) / 2;
    if (query(mid, x2, y1, y2) == 1) {
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }
  x1 = high;
  low = y1, high = y2;
  while (low <= high) {
    int mid = (low + high) / 2;
    if (query(x1, x2, y1, mid) == 1) {
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  y2 = low;
  low = y1, high = y2;
  while (low <= high) {
    int mid = (low + high) / 2;
    if (query(x1, x2, mid, y2) == 1) {
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }
  y1 = high;
}
void solve() {
  int split = -1, dim = 0;
  for (; dim <= 1; ++dim) {
    int low = 1, high = n;
    while (low <= high) {
      int m = (low + high) / 2;
      int a = query(1, m, 1, n, dim);
      if (a >= 1) {
        high = m - 1;
      } else {
        low = m + 1;
      }
    }
    if (low >= n) {
      continue;
    }
    if (query(low + 1, n, 1, n, dim) == 1) {
      split = low;
      break;
    }
  }
  int x11, x12, y11, y12;
  int x21, x22, y21, y22;
  if (dim == 0) {
    x11 = 1, x12 = split, y11 = 1, y12 = n;
    x21 = split + 1, x22 = n, y21 = 1, y22 = n;
  } else {
    x11 = 1, x12 = n, y11 = 1, y12 = split;
    x21 = 1, x22 = n, y21 = split + 1, y22 = n;
  }
  shrink_rect(x11, x12, y11, y12);
  shrink_rect(x21, x22, y21, y22);
  cout << "! " << x11 << " " << y11 << " " << x12 << " " << y12 << " ";
  cout << x21 << " " << y21 << " " << x22 << " " << y22 << endl;
}
int main() {
  cin >> n;
  solve();
  return 0;
}
