#include <bits/stdc++.h>
using namespace std;
const long long MAX = 10004205361450474;
const long long MAGIC = 204761410474;
const int N = 1e4;
unordered_map<long long, long long> dp[10];
pair<long long, long long> query(long long lo, long long hi,
                                 vector<long long> v) {
  printf("%d\n", v.size());
  for (auto it : v) printf("%lld ", it);
  puts("");
  fflush(stdout);
  int ans;
  scanf("%d", &ans);
  if (ans < 0) exit(0);
  if (!ans) return {lo, v[0] - 1};
  if (ans == v.size()) return {v.back() + 1, hi};
  return {v[ans - 1] + 1, v[ans] - 1};
}
void finish(long long lo, long long hi) {
  long long len = hi - lo + 1;
  vector<long long> v;
  if (len <= N) {
    for (long long i = lo; i <= hi; i++) v.push_back(i);
    query(lo, hi, v);
  }
  long long curr = lo - 1;
  long long rem = (len - N) % (N + 1);
  for (int i = 0; i < N + 1; i++) {
    if (i) v.push_back(curr);
    curr += 1 + (len - N) / (N + 1) + (i < rem);
  }
  pair<long long, long long> tmp = query(lo, hi, v);
  finish(tmp.first, tmp.second);
}
long long f(long long l, int k) {
  long long &ref = dp[k][l];
  if (ref) return ref;
  if (k == 1) return ref = l + min(l, (long long)N) - 1;
  long long curr = l - 1;
  for (long long i = 0; i <= min(l, (long long)N); i++) {
    if (k == 2 && curr >= N) {
      curr += (min(l, (long long)N) - i + 1) * (N + 1);
      break;
    }
    curr = f(curr + 1, k - 1) + 1;
  }
  return ref = curr - 1;
}
void search(long long l, long long r, int k) {
  vector<long long> v;
  if (k == 1) {
    for (long long i = l; i <= r; i++) v.push_back(i);
    query(l, r, v);
  }
  long long curr = l - 1;
  for (long long i = 0; i <= min(l, (long long)N); i++) {
    curr = f(curr + 1, k - 1) + 1;
    v.push_back(curr);
  }
  v.pop_back();
  pair<long long, long long> tmp = query(l, r, v);
  search(tmp.first, tmp.second, k - 1);
}
int main() {
  pair<long long, long long> tmp = query(1, MAX, {MAGIC});
  if (tmp.first > 1) finish(MAGIC + 1, MAX);
  search(1, MAGIC, 4);
  return 0;
}
