#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const long long M = 10004205361450474LL;
long long qry(const vector<long long>& v) {
  cout << v.size() << " ";
  for (long long i : v) {
    cout << i << " ";
  }
  cout << endl;
  fflush(stdout);
  long long ans;
  cin >> ans;
  if (ans < 0) exit(0);
  return ans;
}
void solve(long long l, long long r, int remq) {
  if (!remq) assert(0);
  int numq = min(l, (long long)1e4);
  vector<long long> q;
  if (r - l + 1 <= numq) {
    for (long long i = l; i <= r; i++) {
      q.push_back(i);
    }
  } else {
    long long step = (r - l) / (numq + 1);
    long long cur = l;
    for (long long i = 0; i < numq - ((r - l) % (numq + 1)); i++) {
      cur += step;
      q.push_back(cur);
    }
    for (long long i = 0; i < ((r - l) % (numq + 1)); i++) {
      cur += step + 1;
      q.push_back(cur);
    }
  }
  long long ans = qry(q);
  if (ans == 0) {
    solve(l, q[0] - 1, remq - 1);
  } else if (ans >= q.size()) {
    solve(q.back() + 1, r, remq - 1);
  } else {
    solve(q[ans - 1] + 1, q[ans] - 1, remq - 1);
  }
}
void solve3(long long l, long long r, int remq) {
  int numq = min(l, (long long)1e4);
  vector<long long> q;
  if (r - l + 1 <= numq) {
    for (long long i = l; i <= r; i++) {
      q.push_back(i);
    }
  } else {
    long long MAGIC2 = l * 2;
    q.push_back(MAGIC2);
    for (int i = 1; i < numq; i++) {
      if (MAGIC2 > 1e4)
        MAGIC2 += 1e4 + 1;
      else
        MAGIC2 = MAGIC2 * 2 + 2;
      q.push_back(MAGIC2);
    }
  }
  long long ans = qry(q);
  if (ans == 0) {
    solve3(l, q[0] - 1, remq - 1);
  } else if (ans >= q.size()) {
    solve3(q.back() + 1, r, remq - 1);
  } else {
    solve3(q[ans - 1] + 1, q[ans] - 1, remq - 1);
  }
}
void solve2(long long l, long long r, int remq) {
  int numq = min(l, (long long)1e4);
  vector<long long> q;
  if (r - l + 1 <= numq) {
    for (long long i = l; i <= r; i++) {
      q.push_back(i);
    }
  } else {
    long long MAGIC2 = l * 2;
    for (int i = 1; i < l; i++) {
      if (MAGIC2 > 1e4)
        MAGIC2 += 1e4 + 1;
      else
        MAGIC2 = MAGIC2 * 2 + 2;
    }
    MAGIC2 += 1e4 + 1;
    q.push_back(MAGIC2);
    numq--;
    long long step = (r - MAGIC2) / (numq + 1);
    long long cur = MAGIC2;
    step = (r - cur) / (numq + 1);
    for (long long i = 0; i < numq - ((r - MAGIC2) % (numq + 1)); i++) {
      cur += step;
      q.push_back(cur);
    }
    for (long long i = 0; i < ((r - MAGIC2) % (numq + 1)); i++) {
      cur += step + 1;
      q.push_back(cur);
    }
  }
  long long ans = qry(q);
  if (ans == 0) {
    solve3(l, q[0] - 1, remq - 1);
  } else if (ans >= q.size()) {
    solve(q.back() + 1, r, remq - 1);
  } else {
    solve(q[ans - 1] + 1, q[ans] - 1, remq - 1);
  }
}
const long long MAGIC = 204761410474LL;
int main() {
  long long q = qry({MAGIC});
  if (q == 0) {
    q = qry({2046});
    if (q == 0) {
      q = qry({6});
      if (q == 0) {
        q = qry({2});
        if (q == 0) {
          qry({1});
          assert(0);
        } else {
          qry({3, 4, 5});
          assert(0);
        }
      } else {
        solve3(7, 2045, 2);
        assert(0);
        const vector<long long> v = {14, 30, 62, 126, 254, 510, 1022};
        q = qry(v);
        if (q == 0) {
          qry({7, 8, 9, 10, 11, 12, 13});
          assert(0);
        }
        vector<long long> vv;
        for (int i = v[q - 1] + 1; i < v[q - 1] * 2 + 2; i++) {
          vv.push_back(i);
        }
        qry(vv);
        assert(0);
      }
    } else {
      solve2(2047, MAGIC - 1, 3);
    }
  } else {
    solve(MAGIC + 1, M, 4);
  }
  return 0;
}
