#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
map<long long, long long> dp[20];
long long M = 10004205361450474ll;
long long x;
long long count(int d, long long w) {
  if (d == 1) return min(w, 10000ll);
  if (w >= 10000) {
    long long c = count(d - 1, w);
    return c * 10001 + 10000;
  } else {
    long long cw = count(d - 1, w);
    for (int i = 0; i < w; i++) {
      cw++;
      cw += count(d - 1, w + cw);
    }
    return cw;
  }
}
int query(vector<long long> c) {
  printf("%d", ((int)(c).size()));
  for (int i = 0; i < ((int)(c).size()); i++) {
    printf(" %I64d", c[i]);
    assert(c[i] >= 1 && c[i] <= M);
    assert(i == 0 || c[i] > c[i - 1]);
  }
  puts("");
  fflush(stdout);
  int y;
  scanf("%d", &y);
  return y;
}
void query(int d, long long w) {
  if (d == 1) {
    int d = min(w, 10000ll);
    vector<long long> c;
    for (int i = 0; i < d; i++) c.push_back(w + i);
    assert(query(c) == -1);
    return;
  }
  if (w >= 10000) {
    long long c = count(d - 1, w);
    vector<long long> cc;
    long long x = c;
    for (int i = 0; i < 10000; i++) {
      cc.push_back(w + x);
      x += c + 1;
    }
    int y = query(cc);
    if (y == -1) return;
    if (y == 0)
      return query(d - 1, w);
    else
      return query(d - 1, cc[y - 1] + 1);
  } else {
    vector<long long> cc;
    long long x = count(d - 1, w);
    for (int i = 0; i < w; i++) {
      cc.push_back(w + x);
      x++;
      x += count(d - 1, w + x);
    }
    int y = query(cc);
    if (y == -1) return;
    if (y == 0)
      return query(d - 1, w);
    else
      return query(d - 1, cc[y - 1] + 1);
  }
}
int main() { query(5, 1); }
