#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while (((c = getchar()) == ' ') || c == '\n')
    ;
  x = c;
}
const long long lim = 10004205361450474ll;
long long n, m, i, j, k, dp[6][10005];
vector<long long> v;
int main() {
  for (((i)) = (1); ((i)) <= ((4)); ((i))++) {
    for (((j)) = (1); ((j)) <= ((10000)); ((j))++) {
      long long now = j;
      dp[i][j] = dp[i - 1][j];
      now = min(j + dp[i - 1][j] + 1, 10000ll);
      for (((k)) = (1); ((k)) <= ((j)); ((k))++) {
        dp[i][j] += dp[i - 1][now] + 1;
        now = min(now + dp[i - 1][now] + 1, 10000ll);
      }
    }
  }
  long long now = 1;
  for (i = 4; i >= 0; i--) {
    long long nxt = now;
    v.clear();
    for (j = 1; j <= min(now, 10000ll); j++) {
      nxt += dp[i][min(nxt, 10000ll)];
      if (nxt > lim) break;
      v.push_back(nxt);
      nxt++;
    }
    printf("%d", v.size());
    for (__typeof((v).begin()) it = (v).begin(); it != (v).end(); it++)
      printf(" %lld", *it);
    puts("");
    fflush(stdout);
    int x;
    scanf("%d", &x);
    if (x < 0) return 0;
    if (x == 0)
      nxt = now;
    else
      now = v[x - 1] + 1;
  }
  return 0;
}
