#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool uax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
map<pair<long long, long long>, int> cache;
const long long INF = 2e17;
long long rgt(long long x, int k) {
  if (!k) return x + 1;
  if (x > 10000LL) {
    long long add = 1;
    for (int i = 0; i < (int)(k); ++i) {
      if (add > 1e14) {
        add = INF;
      }
      add *= 10000LL + 1;
    }
    return x + add;
  }
  if (k == 1) return x + min(x, 10000LL) + 1;
  long long y = x;
  for (int j = 0; j < (int)(min(10000LL, x) + 1); ++j) {
    y = rgt(y, k - 1);
    if (y > INF) return INF;
  }
  return y;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  cout << fixed;
  long long L = 1, R = 10004205361450474 + 1;
  for (int k = (int)(5) - 1; k >= 0; --k) {
    vector<long long> move;
    long long x = L;
    while (x < R) {
      x = rgt(x, k);
      if (x - 1 < R) move.push_back(x - 1);
    }
    if (move.empty()) move.push_back(L);
    assert(move.size() <= L && move.size() <= 10000);
    cout << move.size() << ' ';
    for (long long x : move) cout << x << ' ';
    cout << endl;
    int ans;
    cin >> ans;
    assert(ans != -2);
    if (ans == -1) return 0;
    if (ans == 0)
      R = move[0];
    else if (ans == move.size())
      L = move.back() + 1;
    else
      L = move[ans - 1] + 1, R = move[ans];
  }
  assert(false);
  return 0;
}
