#include <bits/stdc++.h>
using namespace std;
vector<int> query[25], query2[25];
vector<int> update[25], update2[25];
void solve(int xl, int xr, int yl, int yr, int idx) {
  if (xl > xr || yl >= yr) return;
  int a = (yr - yl + 2) / 2;
  int b = (xr - xl + 1) / 2;
  for (int i = 0; i < a; i++) query[idx].push_back(yr - i);
  for (int i = 0; i < b; i++) update[idx].push_back(xl + i);
  solve(xl, xl + b - 1, yl, yr - a, idx + 1);
  solve(xl + b, xr, yr - a + 1, yr, idx + 1);
}
int ans[1010], num[1010], n;
void ask(vector<int>& q) {
  printf("%d\n", (int)q.size());
  for (int& x : q) printf("%d ", x);
  puts("");
  fflush(stdout);
  for (int i = 1; i <= n; i++) scanf("%d", num + i);
}
int main() {
  scanf("%d", &n);
  solve(1, n, 1, n, 1);
  for (int i = 1; query[i].size(); i++) {
    for (int& x : update[i]) update2[i].push_back(n - x + 1);
    for (int& x : query[i]) query2[i].push_back(n - x + 1);
  }
  memset(ans, 0x3f, sizeof ans);
  for (int i = 1; query[i].size(); i++) {
    ask(query[i]);
    for (int& x : update[i]) ans[x] = min(ans[x], num[x]);
    ask(query2[i]);
    for (int& x : update2[i]) ans[x] = min(ans[x], num[x]);
  }
  puts("-1");
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  puts("");
  return 0;
}
