#include <bits/stdc++.h>
using namespace std;
const int mod = int(1e9) + 7;
const long long maxk = 10000LL;
long long r = 10004205361450474LL;
int n;
map<pair<pair<long long, long long>, long long>, vector<long long> > cp;
long long count_cnt(long long p) {
  long long c = maxk, cnt = 1;
  while (c < p) {
    cnt++;
    if ((p - maxk) / c < maxk + 1) return c;
    c = maxk + c * (maxk + 1LL);
  }
  return cnt;
}
long long get_cnt(long long u) {
  long long ans = maxk;
  for (int i = 2; i <= u; i++) {
    ans = maxk + ans * (maxk + 1LL);
  }
  return ans;
}
bool solve(long long l, long long r, long long k) {
  if (l > r) return true;
  if (r - l + 1 <= min(l, maxk)) {
    return true;
  }
  if (k == 1) {
    return false;
  }
  if (cp.find(make_pair(make_pair(l, r), k)) != cp.end()) {
    return true;
  }
  if (l >= maxk && count_cnt(r - l + 1) > k) {
    return false;
  }
  long long cc = get_cnt(k - 1);
  long long nr = r;
  vector<long long> q;
  while (nr - cc + 1 >= maxk) {
    q.push_back(nr - cc);
    nr -= cc;
    nr--;
  }
  if ((int)q.size() > l) return false;
  long long nl = l;
  long long pppp = (int)q.size();
  for (int i = 0; i < l - pppp; i++) {
    long long ql = nl, qr = min(r + 1, maxk + 1);
    while (qr - ql > 1) {
      long long mid = (ql + qr) / 2;
      if (solve(nl, mid - 1, k - 1)) {
        ql = mid;
      } else
        qr = mid;
    }
    q.push_back(ql);
    nl = ql + 1;
  }
  if (!solve(nl, nr, k - 1)) return false;
  cp[make_pair(make_pair(l, r), k)] = q;
  return true;
}
void okk(long long l, long long r, long long k);
void ask(long long l, long long r, long long k, vector<long long> q) {
  sort(q.begin(), q.end());
  cout << (int)q.size() << endl;
  for (int i = 0; i < (int)q.size(); i++) cout << q[i] << " ";
  cout << endl;
  int p;
  cin >> p;
  if (p == -1) {
    exit(0);
  }
  if (p == -2) {
    assert(0);
  }
  if (p == 0)
    okk(l, q[p] - 1, k - 1);
  else if (p == (int)q.size())
    okk(q[(int)q.size() - 1] + 1, r, k - 1);
  else
    okk(q[p - 1] + 1, q[p] - 1, k - 1);
}
void okk(long long l, long long r, long long k) {
  if (l > r) return;
  if (r - l + 1 <= min(l, maxk)) {
    cout << r - l + 1 << endl;
    for (long long i = l; i <= r; i++) cout << i << " ";
    cout << endl;
    return;
  }
  if (l >= maxk && count_cnt(r - l + 1) > k) {
    cout << l << " " << (r - l + 1) << " " << count_cnt(r - l + 1) << "\n";
    cout << "khe\n";
    exit(0);
    assert(0);
  }
  if (l >= maxk) {
    long long c = get_cnt(k - 1);
    vector<long long> q;
    long long sm = l + c;
    while (sm <= r) {
      q.push_back(sm);
      sm += c + 1;
    }
    ask(l, r, k, q);
    return;
  }
  auto q = cp[make_pair(make_pair(l, r), k)];
  ask(l, r, k, q);
}
int main() {
  solve(1, r, 5);
  okk(1, r, 5);
  return 0;
}
