#include <bits/stdc++.h>
using namespace std;
int main(void) {
  srand(time(0));
  cout << fixed << setprecision(7);
  cerr << fixed << setprecision(7);
  int n;
  cin >> n;
  int asked = 0;
  static int ans[1 << 20];
  auto ask = [&](vector<int> v) {
    ++asked;
    set<int> cc;
    for (auto it : v) cc.insert(it);
    int cnt = v.size();
    cout << cnt << '\n';
    for (int i = 0; i < cnt; ++i) cout << v[i] << " \n"[i + 1 == cnt];
    fflush(stdout);
    for (int i = 1; i <= n; ++i) {
      int val;
      cin >> val;
      if (!cc.count(i)) ans[i] = min(ans[i], val);
    }
    return ans;
  };
  for (int i = 1; i <= n; ++i) ans[i] = 2e9 + 55;
  auto print = [&](void) {
    cout << "-1\n";
    for (int i = 1; i <= n; ++i) cout << ans[i] << " \n"[i == n];
    fflush(stdout);
  };
  static vector<int> w1[1 << 20];
  static vector<int> w2[1 << 20];
  function<void(int, int, int)> div1 = [&](int l, int r, int H) {
    if (l > r)
      return;
    else {
      int mid = (l + r) / 2;
      for (int i = l; i <= mid; ++i) w1[H].push_back(i);
      div1(l, mid - 1, H + 1);
      div1(mid + 1, r, H + 1);
    }
  };
  function<void(int, int, int)> div2 = [&](int l, int r, int H) {
    if (l > r)
      return;
    else {
      int mid = (l + r) / 2;
      for (int i = mid; i <= r; ++i) w2[H].push_back(i);
      div2(l, mid - 1, H + 1);
      div2(mid + 1, r, H + 1);
    }
  };
  div1(1, n, 1);
  div2(1, n, 1);
  for (int i = 1; i <= 20; ++i) {
    if (w1[i].size() && w1[i].size() < n) ask(w1[i]);
    if (w2[i].size() && w2[i].size() < n) ask(w2[i]);
  }
  print();
  cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms"
       << '\n';
  return 0;
}
