#include <bits/stdc++.h>
using namespace std;
int const lim = 1003;
int const MLOG = 22;
int ans[lim + 3];
vector<int> qes[2][MLOG];
vector<pair<int, int> > cur[MLOG];
bool vis[lim + 3];
int n;
void solve(int l, int r, int index) {
  if (l >= r) return;
  int mid = (l + r) / 2;
  cur[index].push_back(make_pair(l, mid));
  cur[index].push_back(make_pair(mid + 1, r));
  solve(l, mid, index + 1);
  solve(mid + 1, r, index + 1);
}
vector<int> res;
void ask(int a, int b) {
  res.clear();
  memset(vis, 0, sizeof vis);
  int sz = qes[a][b].size();
  printf("%d\n", sz);
  for (int i = 0; i < qes[a][b].size(); i++) {
    int che = qes[a][b][i];
    vis[che] = true;
    printf("%d ", che);
  }
  fflush(stdout);
  for (int i = 0; i < n; i++) {
    int x;
    scanf("%d", &x);
    res.push_back(x);
  }
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) ans[i] = INT_MAX;
  solve(1, n, 0);
  int con = 0, con1 = 0;
  for (int i = 0; i < MLOG; i++) {
    if (cur[i].empty()) break;
    for (int j = 0; j < cur[i].size(); j++) {
      int l = cur[i][j].first, r = cur[i][j].second;
      for (int k = l; k <= r; k++) {
        if (j % 2)
          qes[0][con].push_back(k);
        else
          qes[1][con].push_back(k);
      }
    }
    con++;
  }
  for (int i = 0; i < con; i++) {
    ask(1, i);
    for (int j = 0; j < n; j++) {
      if (!vis[j + 1]) ans[j + 1] = min(ans[j + 1], res[j]);
    }
  }
  for (int i = 0; i < con; i++) {
    ask(0, i);
    for (int j = 0; j < n; j++) {
      if (!vis[j + 1]) ans[j + 1] = min(ans[j + 1], res[j]);
    }
  }
  printf("-1\n");
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  fflush(stdout);
}
