#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const long long M = 10004205361450474;
int query(vector<long long> ask) {
  cout << ask.size() << endl;
  for (auto k : ask) cout << k << " ";
  cout << endl;
  cout.flush();
  int ans;
  cin >> ans;
  if (ans < 0) exit(0);
  return ans;
}
long long R[6];
long long DP[10001][6];
long long max_range(long long mini, int queries) {
  if (mini <= 10000) return DP[mini][queries];
  return min(M, mini + R[queries] - 1);
}
void compute() {
  R[1] = 10000;
  for (int i = (2); i < (6); ++i) R[i] = 10000 + 10001 * R[i - 1];
  for (int i = (10000) - 1; i >= (1); --i) {
    DP[i][1] = i + i - 1;
    for (int queries = (2); queries < (6); ++queries) {
      long long res = i;
      for (int j = 0; j < (i + 1); ++j) {
        res = max_range(res, queries - 1);
        if (j < i) res += 2;
      }
      DP[i][queries] = res;
    }
  }
}
long long get_mini(long long start, int queries) {
  if (queries == 1) {
    vector<long long> Q;
    for (int i = 0; i < (min(10000LL, start)); ++i) {
      Q.push_back(start + i);
    }
    query(Q);
    assert(0);
  }
  vector<long long> Q;
  int intervals = min(10001LL, start + 1);
  long long res = start;
  for (int j = 0; j < (intervals); ++j) {
    res = max_range(res, queries - 1);
    if (j < intervals - 1) {
      Q.push_back(res + 1);
      res += 2;
    }
  }
  int ans = query(Q);
  if (ans == 0)
    return start;
  else
    return Q[ans - 1] + 1;
}
int main() {
  ios_base::sync_with_stdio(0);
  compute();
  long long mini = 1;
  for (int q = (6) - 1; q >= (0); --q) {
    mini = get_mini(mini, q);
  }
}
