#include <bits/stdc++.h>
using namespace std;
template <class t>
t lcm(t a, t b) {
  return ((a * b) / __gcd(a, b));
}
long long xx1, yy1, xx2, yy2;
pair<pair<long long, long long>, pair<long long, long long> > fpt, spt;
bool contains() {
  bool cont = true;
  if (fpt.first.first < xx1 || fpt.second.first > xx2) cont = false;
  if (fpt.first.second < yy1 || fpt.second.second > yy2) cont = false;
  return cont;
}
void ask() {
  cout << "? " << xx1 << " " << yy1 << " " << xx2 << " " << yy2 << "\n";
  fflush(stdout);
}
long long searchright1(long long l, long long r) {
  if (l == r) return l;
  long long temp;
  xx2 = (l + r) / 2;
  ask();
  cin >> temp;
  if (temp == 2) {
    return searchright1(l, xx2);
  } else if (temp == 1)
    return searchright1(l, xx2);
  else
    return searchright1(xx2 + 1, r);
}
long long searchright2(long long l, long long r) {
  if (l == r) return l;
  long long temp;
  xx2 = (l + r) / 2;
  ask();
  cin >> temp;
  if (temp == 2) {
    return searchright2(l, xx2);
  } else if (temp == 1 && !contains())
    return searchright2(l, xx2);
  else
    return searchright2(xx2 + 1, r);
}
long long searchleft1(long long l, long long r) {
  if (l == r) return l;
  long long temp;
  xx1 = (l + r + 1) / 2;
  ask();
  cin >> temp;
  if (temp == 2)
    return searchleft1(xx1, r);
  else if (temp == 1)
    return searchleft1(xx1, r);
  else
    return searchleft1(l, xx1 - 1);
}
long long searchleft2(long long l, long long r) {
  if (l == r) return l;
  long long temp;
  xx1 = (l + r + 1) / 2;
  ask();
  cin >> temp;
  if (temp == 2)
    return searchleft2(xx1, r);
  else if (temp == 1 && !contains())
    return searchleft2(xx1, r);
  else
    return searchleft2(l, xx1 - 1);
}
long long searchtop1(long long l, long long r) {
  if (l == r) return l;
  long long temp;
  yy2 = (l + r) / 2;
  ask();
  cin >> temp;
  if (temp == 2) {
    return searchtop1(l, yy2);
  } else if (temp == 1)
    return searchtop1(l, yy2);
  else
    return searchtop1(yy2 + 1, r);
}
long long searchtop2(long long l, long long r) {
  if (l == r) return l;
  long long temp;
  yy2 = (l + r) / 2;
  ask();
  cin >> temp;
  if (temp == 2) {
    return searchtop2(l, yy2);
  } else if (temp == 1 && !contains())
    return searchtop2(l, yy2);
  else
    return searchtop2(yy2 + 1, r);
}
long long searchbottom1(long long l, long long r) {
  if (l == r) return l;
  yy1 = (l + r + 1) / 2;
  long long temp;
  ask();
  cin >> temp;
  if (temp == 2) {
    return searchbottom1(yy1, r);
  } else if (temp == 1) {
    return searchbottom1(yy1, r);
  } else
    return searchbottom1(l, yy1 - 1);
}
long long searchbottom2(long long l, long long r) {
  if (l == r) return l;
  yy1 = (l + r + 1) / 2;
  long long temp;
  ask();
  cin >> temp;
  if (temp == 2) {
    return searchbottom2(yy1, r);
  } else if (temp == 1 && !contains()) {
    return searchbottom2(yy1, r);
  } else
    return searchbottom2(l, yy1 - 1);
}
int main() {
  long long n;
  cin >> n;
  bool found = false;
  {
    xx1 = 1;
    yy1 = 1;
    yy2 = n;
    fpt.second.first = searchright1(1, n);
    xx1 = 1;
    yy1 = 1;
    xx2 = fpt.second.first;
    yy2 = n;
    fpt.first.first = searchleft1(1, fpt.second.first);
    xx1 = fpt.first.first;
    yy1 = 1;
    xx2 = fpt.second.first;
    yy2 = n;
    fpt.first.second = searchbottom1(1, n);
    xx1 = fpt.first.first;
    yy1 = fpt.first.second;
    xx2 = fpt.second.first;
    yy2 = n;
    fpt.second.second = searchtop1(fpt.first.second, n);
    xx1 = fpt.first.first;
    yy1 = fpt.first.second;
    xx2 = fpt.second.first;
    yy2 = fpt.second.second;
  }
  {
    xx1 = 1;
    xx2 = n;
    yy1 = 1;
    yy2 = n;
    spt.second.first = searchright2(1, n);
    xx1 = 1;
    yy1 = 1;
    xx2 = spt.second.first;
    yy2 = n;
    spt.first.first = searchleft2(1, spt.second.first);
    xx1 = spt.first.first;
    yy1 = 1;
    xx2 = spt.second.first;
    yy2 = n;
    spt.first.second = searchbottom2(1, n);
    xx1 = spt.first.first;
    yy1 = spt.first.second;
    xx2 = spt.second.first;
    yy2 = n;
    spt.second.second = searchtop2(spt.first.second, n);
    xx1 = spt.first.first;
    yy1 = spt.first.second;
    xx2 = spt.second.first;
    yy2 = spt.second.second;
  }
  cout << "! " << fpt.first.first << " " << fpt.first.second << " "
       << fpt.second.first << " " << fpt.second.second << " " << spt.first.first
       << " " << spt.first.second << " " << spt.second.first << " "
       << spt.second.second << "\n";
  fflush(stdout);
  return 0;
}
