#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const long long LL_INF = 1ll * INF * INF;
const int MAX_N = 200000 + 7;
const int mod = INF;
template <typename T>
inline void addmod(T& a, const long long& b, const int& MOD = mod) {
  a = (a + b) % MOD;
  if (a < 0) a += MOD;
}
long long calc(long long k, int n) {
  if (n == 1) return k;
  return k + (k + 1) * calc(k, n - 1);
}
long long find_max(long long i, int query, long long base, long long max_base) {
  if (query == 1) {
    return i + base - 1;
  }
  long long nxt = find_max(i, query - 1, base, max_base);
  int step = (int)base;
  for (int j = 0; j < step; ++j) {
    ++nxt;
    base = max(base, nxt + 1);
    base = min(base, max_base);
    if (base < max_base) {
      nxt = find_max(nxt + 1, query - 1, base, max_base);
    } else {
      nxt += (1 + calc(max_base, query - 1)) * (step - j) - 1;
      break;
    }
  }
  return nxt;
}
const long long M = 10004205361450474ll;
int ask(vector<long long> a) {
  while (!a.empty() && a.back() > M) a.pop_back();
  cout << (int)(a).size() << ' ';
  for (int j = (0), _b = ((int)(a).size()); j < _b; ++j)
    cout << a[j] << " \n"[j + 1 == (int)(a).size()];
  cout.flush();
  int ans;
  cin >> ans;
  if (ans < 0) exit(0);
  return ans;
}
void find_ans(long long i, int query, long long base, long long max_base) {
  if (query == 1) {
    vector<long long> tmp(base);
    iota(tmp.begin(), tmp.end(), i);
    ask(tmp);
    return;
  }
  vector<long long> tmp;
  vector<long long> new_base;
  long long nxt = find_max(i, query - 1, base, max_base);
  int step = (int)base;
  long long old_base = base;
  for (int j = 0; j < step; ++j) {
    ++nxt;
    base = max(base, nxt + 1);
    base = min(base, max_base);
    new_base.push_back(base);
    tmp.push_back(nxt);
    if (base < max_base) {
      nxt = find_max(nxt + 1, query - 1, base, max_base);
    } else {
      nxt += calc(max_base, query - 1);
    }
  }
  int r = ask(tmp);
  if (r == 0)
    find_ans(i, query - 1, old_base, max_base);
  else
    find_ans(tmp[r - 1] + 1, query - 1, new_base[r - 1], max_base);
}
long long find_query(long long best, int query) {
  if (best == 1) return 1;
  long long lo = 1, hi = min(100000000000000ll, best), res = 0;
  while (lo <= hi) {
    long long mid = (lo + hi) / 2;
    if (find_max(mid + 1, query, min(mid + 1, 10000ll), 10000) >= best) {
      res = mid;
      hi = mid - 1;
    } else
      lo = mid + 1;
  }
  return res;
}
void solve() {
  long long best = M;
  for (int query = 5; query > 0; --query) {
    long long pos = find_query(best, query - 1);
    int r = ask({pos});
    if (r == 1)
      find_ans(pos + 1, query - 1, min(10000ll, pos + 1), 10000);
    else
      best = pos - 1;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  const bool multiple_test = false;
  int test = 1;
  if (multiple_test) cin >> test;
  for (int i = 0; i < test; ++i) {
    solve();
  }
}
