#include <bits/stdc++.h>
using namespace std;
set<int> st;
set<int>::iterator it;
map<int, int> mp;
int l, r;
int x[11111], xl;
int y[11111], yl;
int q(int x, int y) {
  if (x == y && mp.find(x) != mp.end()) return mp[x];
  printf("%d %d %d\n", 0, x, y);
  fflush(stdout);
  int res;
  scanf("%d", &res);
  if (x == y) mp[x] = res;
  return res;
}
void proc(int l, int r) {
  if (l >= r - 1) return;
  int mi = (l + r) / 2;
  int v = q(mi, mi);
  if (!v) {
    st.insert(mi);
    if (mi != r) proc(l, mi);
    if (mi != l) proc(mi, r);
  } else {
    int vl = q(mi - v, mi - v), vr = q(mi + v, mi + v);
    if (!vl && !vr) {
      st.insert(mi - v);
      st.insert(mi + v);
      proc(l, mi - v);
      if (mi - v > l || mi + v < r) proc(mi - v, mi + v);
      proc(mi + v, r);
    } else if (!vl && mi - v > l) {
      st.insert(mi - v);
      proc(l, mi - v);
      proc(mi - v, r);
    } else if (!vr && mi + v < r) {
      st.insert(mi + v);
      proc(l, mi + v);
      proc(mi + v, r);
    }
  }
}
int main() {
  mp.clear();
  l = -100000000 + q(-100000000, -100000000);
  r = 100000000 - q(100000000, 100000000);
  st.insert(l);
  st.insert(r);
  mp[l] = mp[r] = 0;
  proc(l, r);
  int e = -100000000;
  while (st.find(e) != st.end()) e++;
  for (it = st.begin(); it != st.end(); it++) {
    int v = (*it);
    if (q(v, e) == 0) x[xl++] = v;
    if (q(e, v) == 0) y[yl++] = v;
  }
  printf("1 %d %d\n", xl, yl);
  for (int i = 0; i < xl; i++) printf("%d%c", x[i], i < xl - 1 ? ' ' : '\n');
  for (int i = 0; i < yl; i++) printf("%d%c", y[i], i < yl - 1 ? ' ' : '\n');
  fflush(stdout);
  return 0;
}
