#include <bits/stdc++.h>
using namespace std;
int ask(vector<long long> V) {
  cout << V.size() << " ";
  for (long long v : V) cout << v << " ";
  cout << endl;
  int n;
  cin >> n;
  if (n == -1) exit(0);
  assert(n != -2);
  return n;
}
long long cnt(int q) {
  if (q == 1) {
    return 10000;
  }
  return 10001 * cnt(q - 1) + 10000;
}
long long mem[6][10010];
long long getMax(int q, long long lo) {
  if (lo >= 10000) return cnt(q) + lo - 1;
  if (mem[q][lo] != -1) return mem[q][lo];
  if (q == 1) {
    return lo + min(lo, 10000LL) - 1;
  }
  long long ma = lo;
  for (long long i = 0; i <= lo && i <= 10000; ++i) {
    if (i > 0) ma += 2;
    ma = getMax(q - 1, ma);
  }
  return mem[q][lo] = ma;
}
void go(int q, long long lo, long long hi) {
  vector<long long> V;
  for (int i = 0; i < min(lo, 10000LL); ++i) {
    if (q == 1) {
      V.push_back(lo + i);
    } else {
      long long en = (V.size() == 0) ? lo : (V.back() + 1);
      en = getMax(q - 1, en);
      V.push_back(en + 1);
    }
  }
  int t = ask(V);
  if (t == 0)
    go(q - 1, lo, V[0] - 1);
  else if (t == V.size())
    go(q - 1, V.back() + 1, hi);
  else
    go(q - 1, V[t - 1] + 1, V[t] - 1);
}
int main() {
  memset(mem, -1, sizeof(mem));
  go(5, 1, 10004205361450474LL);
}
