#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000, MAXQUES = 20, oo = 1000000009;
int n, tmp[MAXN + 9], ans[MAXN + 9];
bool lef[MAXQUES + 9][MAXN + 9];
void Divide(int lvl, int low, int high) {
  if (low == high) {
    return;
  }
  int mid = (low + high) / 2;
  for (int i = low; i <= mid; i++) {
    lef[lvl + 1][i] = lef[lvl][i];
  }
  for (int i = mid + 1; i <= high; i++) {
    lef[lvl + 1][i] = !lef[lvl][i];
  }
  Divide(lvl + 1, low, mid);
  Divide(lvl + 1, mid + 1, high);
}
int main() {
  srand(time(NULL));
  cin >> n;
  for (int i = 1; i <= n; i++) {
    lef[0][i] = true;
  }
  Divide(0, 1, n);
  fill(ans + 1, ans + n + 1, oo);
  for (int i = 1; i <= MAXQUES / 2; i++) {
    vector<int> vLef, vRig;
    for (int j = 1; j <= n; j++) {
      if (lef[i][j]) {
        vLef.push_back(j);
      } else {
        vRig.push_back(j);
      }
    }
    if (!vLef.empty()) {
      cout << vLef.size() << "\n";
      for (int j = 0; j < vLef.size(); j++) {
        cout << vLef[j] << " ";
      }
      cout << "\n";
      fflush(stdout);
      for (int j = 1; j <= n; j++) {
        cin >> tmp[j];
      }
      for (int j = 0; j < vRig.size(); j++) {
        ans[vRig[j]] = min(ans[vRig[j]], tmp[vRig[j]]);
      }
    }
    if (!vRig.empty()) {
      cout << vRig.size() << "\n";
      for (int j = 0; j < vRig.size(); j++) {
        cout << vRig[j] << " ";
      }
      cout << "\n";
      fflush(stdout);
      for (int j = 1; j <= n; j++) {
        cin >> tmp[j];
      }
      for (int j = 0; j < vLef.size(); j++) {
        ans[vLef[j]] = min(ans[vLef[j]], tmp[vLef[j]]);
      }
    }
  }
  cout << "-1\n";
  for (int i = 1; i <= n; i++) {
    cout << ans[i] << " ";
  }
  cout << "\n";
  fflush(stdout);
  return 0;
}
