#include <bits/stdc++.h>
using namespace std;
int cnt = 0;
int minVal[1000 + 5], response[1000 + 5];
vector<pair<pair<int, int>, pair<int, int> > > seq, new_seq;
vector<int> ask;
int n;
void doIt() {
  printf("%d\n", ask.size());
  for (auto x : ask) printf("%d ", x);
  fflush(stdout);
}
void sayIt() {
  puts("-1");
  int i;
  for (i = 1; i <= n; i++) printf("%d ", minVal[i]);
  fflush(stdout);
}
int main() {
  int i, j, k;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) minVal[i] = numeric_limits<int>::max();
  pair<int, int> p1, p2;
  p1 = pair<int, int>(1, 1);
  p2 = pair<int, int>(n, n);
  seq.push_back(make_pair(p1, p2));
  while (seq.size()) {
    p1 = seq[0].first;
    p2 = seq[0].second;
    if (p1.first == p2.first && p1.second == p2.second) break;
    ask.clear();
    for (auto x : seq) {
      p1 = x.first;
      p2 = x.second;
      int mid = (p1.first + p2.first) / 2;
      for (i = p1.first; i <= mid; i++) ask.push_back(i);
    }
    doIt();
    for (i = 1; i <= n; i++) scanf("%d", &response[i]);
    for (auto x : seq) {
      p1 = x.first, p2 = x.second;
      int mid = (p1.first + p2.first) / 2;
      for (i = mid + 1; i <= p2.first; i++)
        minVal[i] = min(minVal[i], response[i]);
    }
    ask.clear();
    for (auto x : seq) {
      p1 = x.first;
      p2 = x.second;
      int mid = (p1.first + p2.first) / 2;
      for (i = mid + 1; i <= p2.first; i++) ask.push_back(i);
    }
    doIt();
    for (i = 1; i <= n; i++) scanf("%d", &response[i]);
    for (auto x : seq) {
      p1 = x.first, p2 = x.second;
      int mid = (p1.first + p2.first) / 2;
      for (i = p1.first; i <= mid; i++) minVal[i] = min(minVal[i], response[i]);
    }
    new_seq.clear();
    for (auto x : seq) {
      p1 = x.first, p2 = x.second;
      int mid = (p1.first + p2.first) / 2;
      new_seq.push_back(make_pair(p1, pair<int, int>(mid, mid)));
      new_seq.push_back(make_pair(pair<int, int>(mid + 1, mid + 1), p2));
    }
    seq = new_seq;
  }
  sayIt();
  return 0;
}
