#include <bits/stdc++.h>
using UIntType = unsigned int;
std::size_t log2(std::size_t x) {
  std::size_t result = 0;
  std::size_t tmp = x;
  while (tmp != 0) {
    ++result;
    tmp >>= 1;
  }
  if ((1U << (result - 1)) == x) {
    --result;
  }
  return result;
}
int main() {
  std::size_t n;
  std::cin >> n;
  std::size_t log = log2(n);
  std::vector<std::vector<UIntType>> results(2 * log, std::vector<UIntType>(n));
  for (std::size_t i = 0; i < log; ++i) {
    std::size_t divisor = (1U << i);
    std::vector<std::size_t> out;
    out.reserve(n);
    for (std::size_t j = 1; j <= n; ++j) {
      if (((j + divisor - 1) / divisor) % 2 == 1) {
        out.emplace_back(j);
      }
    }
    std::cout << out.size() << std::endl;
    for (auto pos : out) {
      std::cout << pos << ' ';
    }
    std::cout << std::endl;
    for (auto& result : results[i * 2]) {
      std::cin >> result;
    }
    out.clear();
    for (std::size_t j = 1; j <= n; ++j) {
      if (((j + divisor - 1) / divisor) % 2 == 0) {
        out.emplace_back(j);
      }
    }
    std::cout << out.size() << std::endl;
    for (auto pos : out) {
      std::cout << pos << ' ';
    }
    std::cout << std::endl;
    for (auto& result : results[i * 2 + 1]) {
      std::cin >> result;
    }
  }
  std::cout << -1 << std::endl;
  for (std::size_t i = 1; i <= n; ++i) {
    UIntType result = std::numeric_limits<UIntType>::max();
    for (std::size_t j = 0; j < log; ++j) {
      std::size_t divisor = (1U << j);
      if (((i + divisor - 1) / divisor) % 2 == 0) {
        result = std::min(result, results[2 * j][i - 1]);
      } else {
        result = std::min(result, results[2 * j + 1][i - 1]);
      }
    }
    std::cout << result << ' ';
  }
  std::cout << std::endl;
  return 0;
}
