#include <bits/stdc++.h>
static void get_moves(int l, int r, std::vector<std::bitset<1000> > &moves) {
  if (l == r) return;
  if (l + 1 == r) {
    std::bitset<1000> m;
    m.set(l);
    moves.push_back(m);
    m.reset(l);
    m.set(r);
    moves.push_back(m);
    return;
  }
  std::vector<std::bitset<1000> > left, right;
  const int m = l + (r - l) / 2;
  get_moves(l, m, left);
  get_moves(m + 1, r, right);
  left.resize(std::max(left.size(), right.size()));
  right.resize(std::max(left.size(), right.size()));
  for (int i = 0; i != (int)left.size(); ++i)
    moves.push_back(left[i] | right[i]);
  std::bitset<1000> move;
  for (int i = l; i <= m; ++i) move.set(i);
  moves.push_back(move);
  move.reset();
  for (int i = m + 1; i <= r; ++i) move.set(i);
  moves.push_back(move);
}
int main() {
  std::ios_base::sync_with_stdio(false);
  int n;
  std::cin >> n;
  std::vector<std::bitset<1000> > moves;
  get_moves(0, n - 1, moves);
  std::vector<long> mins(n, std::numeric_limits<long>::max());
  for (int i = 0; i != (int)moves.size(); ++i) {
    std::cout << moves[i].count() << "\n";
    for (int j = 0; j != 1000; ++j) {
      if (!moves[i].test(j)) continue;
      std::cout << j + 1 << " ";
    }
    std::cout << std::endl;
    for (int j = 0; j != n; ++j) {
      long x;
      std::cin >> x;
      if (moves[i].test(j)) continue;
      mins[j] = std::min(mins[j], x);
    }
  }
  std::cout << "-1\n";
  for (int j = 0; j != n; ++j) std::cout << mins[j] << " ";
  std::cout << std::endl;
  return 0;
}
