#include <bits/stdc++.h>
using namespace std;
const long long M = 10004205361450474;
const long long MAXK = 10000;
const long long Q0 = 0;
const long long Q1 = MAXK + (MAXK + 1) * Q0;
const long long Q2 = MAXK + (MAXK + 1) * Q1;
const long long Q3 = MAXK + (MAXK + 1) * Q2;
const long long Q4 = MAXK + (MAXK + 1) * Q3;
const long long Q5 = M;
vector<long long> nothing;
bool canwin(long long queries_left, long long a, long long b,
            long long find_flag = 0,
            vector<long long>& what_to_guess = nothing) {
  if (a > b) return 1;
  if (queries_left == 0) return 0;
  long long k = min(10000LL, a);
  long long len = b - a + 1;
  long long max_len;
  long long prev;
  if (queries_left == 1) {
    max_len = Q1;
    prev = Q0;
  }
  if (queries_left == 2) {
    max_len = Q2;
    prev = Q1;
  }
  if (queries_left == 3) {
    max_len = Q3;
    prev = Q2;
  }
  if (queries_left == 4) {
    max_len = Q4;
    prev = Q3;
  }
  if (queries_left == 5) {
    max_len = Q5;
    prev = Q4;
  }
  if (len > max_len) return 0;
  if (k == 10000) {
    if (find_flag) {
      for (long long r = 0; r < k; r++) {
        long long d = a + prev + (prev + 1) * r;
        if (d <= b) {
          what_to_guess.push_back(d);
        } else {
          break;
        }
      }
    }
    return 1;
  }
  vector<long long> guesses;
  long long cur_start = a;
  for (int i = 0; i < k; i++) {
    if (cur_start > b) break;
    long long s_guess = cur_start;
    long long e_guess = b + 1;
    if (queries_left == 5) {
      s_guess = 204761410474LL;
      e_guess = 204761410475LL;
    }
    while (s_guess + 1 < e_guess) {
      long long m_guess = (s_guess + e_guess) / 2;
      if (canwin(queries_left - 1, cur_start, m_guess - 1)) {
        s_guess = m_guess;
      } else {
        e_guess = m_guess;
      }
    }
    guesses.push_back(s_guess);
    cur_start = s_guess + 1;
  }
  if (canwin(queries_left - 1, cur_start, b)) {
    if (find_flag) {
      what_to_guess = guesses;
    }
    return 1;
  } else {
    return 0;
  }
}
int main() {
  long long queries_left = 5;
  long long a = 1;
  long long b = M;
  while (1) {
    vector<long long> what_do;
    assert(canwin(queries_left, a, b, 1, what_do));
    cout << what_do.size() << " ";
    for (int i = 0; i < what_do.size(); i++) {
      cout << what_do[i] << " ";
    }
    cout << endl;
    long long res;
    cin >> res;
    if (res == -2) return 0;
    if (res == -1) return 0;
    if (res < what_do.size()) {
      b = what_do[res] - 1;
    }
    if (res > 0) {
      a = what_do[res - 1] + 1;
    }
    queries_left--;
  }
}
