#include <bits/stdc++.h>
using namespace std;
const int mod = (1e9) + 7;
const double eps = 1e-6;
const int siz = 1e5 + 5, siz2 = 1e5 + 5;
long long dp[6][10001], mxv = 10004205361450474;
int mxl = 10000;
long long add(long long a, long long b, long long mx) { return min(a + b, mx); }
long long solve(int q, int l) {
  if (q == 1) {
    return dp[q][l] = min(l, mxl);
  }
  if (dp[q][l] != -1) {
    return dp[q][l];
  }
  int cur = l;
  long long acc = 0;
  for (int i = 0; i < l; i++) {
    long long range = solve(q - 1, cur);
    cur = add(cur, range, mxl);
    acc = add(acc, range + 1, mxv);
    cur = add(cur, 1, mxl);
  }
  long long range = solve(q - 1, cur);
  acc = add(acc, range, mxv);
  return dp[q][l] = acc;
}
int query(vector<long long> &qs) {
  int sz = qs.size();
  printf("%d ", sz);
  for (int i = 0; i < sz; i++) {
    printf("%I64d", qs[i]);
    if (i < sz - 1) {
      printf(" ");
    } else {
      printf("\n");
    }
  }
  fflush(stdout);
  int resp;
  scanf("%d", &resp);
  return resp;
}
int main() {
  memset(dp, -1, sizeof dp);
  solve(5, 1);
  long long l = 1, r = mxv;
  for (int i = 5; i >= 1; i--) {
    vector<long long> qs;
    long long cur = l;
    if (i == 1) {
      for (int j = 0; j < min(l, (long long)mxl); j++) {
        qs.push_back(cur);
        if (cur == mxv) {
          break;
        }
        cur += 1;
      }
    } else {
      for (int j = 0; j < min(l, (long long)mxl); j++) {
        cur = add(cur, dp[i - 1][min(cur, (long long)mxl)], mxv);
        qs.push_back(cur);
        if (cur == mxv) {
          break;
        }
        cur = add(cur, 1, mxv);
      }
    }
    int resp = query(qs);
    if (resp <= -1) {
      return 0;
    }
    if (resp == 0) {
      r = qs[0] - 1;
    } else if (resp == qs.size()) {
      l = qs[qs.size() - 1] + 1;
    } else {
      l = qs[resp - 1] + 1;
      r = qs[resp] - 1;
    }
  }
  return 0;
}
