#include <bits/stdc++.h>
using namespace std;
struct heap {
  heap *l, *r;
  int L, R;
  heap(int ll, int rr) {
    l = r = nullptr;
    L = ll;
    R = rr;
  }
};
heap* root;
set<int> l, r;
heap* newheap(int l, int r) {
  heap* tmp = new heap(l, r);
  if (l + 1 != r) {
    tmp->l = newheap(l, (l + r) / 2);
    tmp->r = newheap((r + l) / 2, r);
  }
  return tmp;
}
void out(heap* h, int n) {
  if (h == nullptr) return;
  if (h->L + 1 == h->R) return;
  if (n == 0) {
    for (int i = h->l->L; i < h->l->R; i++) l.insert(i);
    for (int i = h->r->L; i < h->r->R; i++) r.insert(i);
  } else {
    out(h->l, n - 1);
    out(h->r, n - 1);
  }
}
int main() {
  int n;
  cin >> n;
  vector<int> a(n);
  vector<int> minim(n, 1e9 + 1);
  root = newheap(0, n);
  for (int i = 0; i < (int(log2(n)) + ((log2(n) - int(log2(n))) != 0)); i++) {
    out(root, i);
    cout << l.size() << endl;
    cout.flush();
    for (set<int>::iterator it = l.begin(); it != l.end(); it++) {
      cout << (*it) + 1 << ' ';
      cout.flush();
    }
    cout << endl;
    cout.flush();
    for (int j = 0; j < n; j++) cin >> a[j];
    for (int j = 0; j < n; j++) {
      if (l.find(j) == l.end())
        minim[j] = min(minim[j], a[j]);
      else
        (l.erase(j));
    }
    cout << r.size() << endl;
    cout.flush();
    for (set<int>::iterator it = r.begin(); it != r.end(); it++) {
      cout << (*it) + 1 << ' ';
      cout.flush();
    }
    cout << endl;
    cout.flush();
    for (int j = 0; j < n; j++) cin >> a[j];
    for (int j = 0; j < n; j++) {
      if (r.find(j) == r.end())
        minim[j] = min(minim[j], a[j]);
      else
        (r.erase(j));
    }
  }
  cout << -1 << endl;
  cout.flush();
  for (int i = 0; i < n; i++) {
    cout << minim[i] << ' ';
    cout.flush();
  }
  return 0;
}
