#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 5;
int n, row[MAXN], col[MAXN], rem = 2019;
vector<int> oddRow, oddCol;
vector<pair<int, int> > ans;
int ask(int x1, int y1, int x2, int y2) {
  --rem;
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int feed;
  scanf("%d", &feed);
  return feed;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    col[i] = ask(1, i, n, i);
    if (col[i] % 2) {
      oddCol.push_back(i);
    }
  }
  for (int i = 1; i <= n; ++i) {
    row[i] = ask(i, 1, i, n);
    if (row[i] % 2) {
      oddRow.push_back(i);
    }
  }
  if (oddRow.size() == 2 && oddCol.size() == 2) {
    for (int i = 0; i < 4; ++i) {
      int tmp = ask(oddRow[i / 2], oddCol[i % 2], oddRow[i / 2], oddCol[i % 2]);
      if (tmp % 2) {
        ans.push_back(pair<int, int>(oddRow[i / 2], oddCol[i % 2]));
      }
    }
  } else {
    if (oddRow.size() == 0 && oddCol.size() == 0) assert(false);
    if (oddRow.size() == 0) {
      int col1 = oddCol[0], col2 = oddCol[1];
      int l = 1, r = n;
      while (l < r) {
        int mid = (l + r) / 2;
        int tmp = ask(l, col1, mid, col1);
        if (tmp % 2) {
          r = mid;
        } else {
          l = mid + 1;
        }
      }
      ans.push_back(pair<int, int>(l, col1));
      ans.push_back(pair<int, int>(l, col2));
    } else {
      int row1 = oddRow[0], row2 = oddRow[1];
      int l = 1, r = n;
      while (l < r) {
        int mid = (l + r) / 2;
        int tmp = ask(row1, l, row1, mid);
        if (tmp % 2) {
          r = mid;
        } else {
          l = mid + 1;
        }
      }
      ans.push_back(pair<int, int>(row1, l));
      ans.push_back(pair<int, int>(row2, l));
    }
  }
  printf("! %d %d %d %d\n", ans[0].first, ans[0].second, ans[1].first,
         ans[1].second);
}
