#include <bits/stdc++.h>
long long read() {
  long long r = 0, t = 1, c = getchar();
  while (c < '0' || c > '9') {
    t = c == '-' ? -1 : 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    r = r * 10 + c - 48;
    c = getchar();
  }
  return r * t;
}
std::map<long long, long long> f[10];
int op = 0;
long long val;
int Query(long long val, std::vector<long long> a) {
  long long n = a.size();
  if (n > val) return -2;
  for (long long i = (0), end_i = (n - 1); i <= end_i; i++)
    if (a[i] == val) return -1;
  for (long long i = (0), end_i = (n - 1); i <= end_i; i++)
    if (val < a[i]) return i;
  return n;
}
int query(std::vector<long long> a) {
  static int cnt = 0;
  assert((++cnt) <= 5);
  assert(a.size() <= 10000);
  if (!op) {
    printf("%d", (int)a.size());
    for (auto i : a) printf(" %lld", i);
    ;
    putchar(10);
    fflush(stdout);
  }
  int ans;
  if (op)
    ans = Query(val, a);
  else
    ans = read();
  assert(ans != -2);
  if (ans == -1) {
    if (op) printf("Accepted.\n");
    exit(0);
  }
  return ans;
}
long long solve(int t, long long l) {
  long long st = std::min(l, 10000ll);
  if (t == 1) return l + st - 1;
  long long p = l - 1;
  for (long long i = (1), end_i = (st + 1); i <= end_i; i++)
    p = solve(t - 1, p + 1) + 1;
  return f[t][l] = p - 1;
}
void calc(long long l, long long r) {
  r++;
  if (r - l <= 10000) {
    std::vector<long long> a;
    for (long long i = (l), end_i = (r - 1); i <= end_i; i++) a.push_back(i);
    query(a);
    assert(0);
  }
  long long d = r - l;
  std::vector<long long> a;
  for (long long i = (1), end_i = (10000); i <= end_i; i++)
    a.push_back(l + (__int128)d * i / 10001);
  int u = query(a);
  a.push_back(r);
  calc(u ? a[u - 1] + 1 : l, a[u] - 1);
}
void Solve(int t, long long l) {
  long long st = std::min(l, 10000ll);
  if (t == 1) {
    std::vector<long long> a;
    for (long long i = (0), end_i = (st - 1); i <= end_i; i++)
      a.push_back(l + i);
    query(a);
    assert(0);
  }
  long long p = l - 1;
  std::vector<long long> a;
  for (long long i = (1), end_i = (st + 1); i <= end_i; i++) {
    if (t - 1 > 1) {
      p = f[t - 1][p + 1] + 1;
    } else
      p = p + std::min(p + 1, 10000ll) + 1;
    if (i != st + 1) a.push_back(p);
  }
  int u = query(a);
  Solve(t - 1, u ? a[u - 1] + 1 : l);
}
int main() {
  if (op == 1) val = read();
  if (query({204761410474ll}))
    calc(204761410475ll, 10004205361450474ll);
  else {
    solve(4, 1);
    Solve(4, 1);
  }
  return 0;
}
