#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3F3F3F3F, MAXN = 1000, MAXLOG = 10;
int a0[MAXLOG][MAXN], a1[MAXLOG][MAXN], n;
void ask_0(int b) {
  vector<int> vec;
  for (int i = 0; i < (1 << (MAXLOG - b - 1)); i++) {
    int u = i << (b + 1);
    if (u > n) break;
    for (int j = 0; j < (1 << b); j++) {
      int v = u + j;
      if (v > n) break;
      if (v) vec.push_back(v);
    }
  }
  if (vec.empty() || (int)vec.size() == n) {
    for (int i = 0; i < n; i++) a0[b][i] = INF;
    return;
  }
  printf("%d\n%d", (int)vec.size(), vec[0]);
  for (int i = 1; i < (int)vec.size(); i++) printf(" %d", vec[i]);
  printf("\n");
  fflush(stdout);
  for (int i = 0; i < n; i++) scanf("%d", &a0[b][i]);
}
void ask_1(int b) {
  vector<int> vec;
  for (int i = 0; i < (1 << (MAXLOG - b - 1)); i++) {
    int u = ((i << 1) + 1) << b;
    if (u > n) break;
    for (int j = 0; j < (1 << b); j++) {
      int v = u + j;
      if (v > n) break;
      vec.push_back(v);
    }
  }
  if (vec.empty() || (int)vec.size() == n) {
    for (int i = 0; i < n; i++) a1[b][i] = INF;
    return;
  }
  printf("%d\n%d", (int)vec.size(), vec[0]);
  for (int i = 1; i < (int)vec.size(); i++) printf(" %d", vec[i]);
  printf("\n");
  fflush(stdout);
  for (int i = 0; i < n; i++) scanf("%d", &a1[b][i]);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < MAXLOG; i++) {
    ask_0(i);
    ask_1(i);
  }
  printf("-1\n");
  for (int i = 0; i < n; i++) {
    int sol = INF;
    for (int j = 0; j < MAXLOG; j++)
      if (((i + 1) >> j) & 1)
        sol = min(sol, a0[j][i]);
      else
        sol = min(sol, a1[j][i]);
    if (i) printf(" ");
    printf("%d", sol);
  }
  printf("\n");
  fflush(stdout);
  return 0;
}
