#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
const int inf = 1e9 + 7;
int n, was[N], a[N], result[N];
vector<vector<int>> go(int n, int row) {
  if (n == 1) {
    return vector<vector<int>>();
  }
  auto lf = go(n / 2, row);
  auto rg = go(n / 2, row + (n + 1) / 2);
  vector<vector<int>> result;
  vector<int> f, s;
  for (int i = 0; i < n / 2; ++i) {
    f.push_back(row + (n + 1) / 2 + i);
    s.push_back(row + i);
  }
  result.push_back(f);
  result.push_back(s);
  int m = (int)lf.size();
  vector<int> now;
  for (int i = 0; i < m; ++i) {
    now.clear();
    for (auto& x : lf[i]) now.push_back(x);
    for (auto& x : rg[i]) now.push_back(x);
    if (n & 1) now.push_back(row + n / 2);
    if (!now.empty()) result.push_back(now);
  }
  if (!m && n % 2) {
    now.clear();
    now.push_back(row + n / 2);
    result.push_back(now);
  }
  return result;
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    result[i] = inf;
  }
  auto que = go(n, 1);
  for (auto& item : que) {
    fill(was, was + n + 1, 0);
    cout << item.size() << endl;
    for (auto& x : item) cout << x << " ", was[x] = 1;
    cout << endl;
    for (int i = 1; i <= n; ++i) {
      cin >> a[i];
      if (!was[i]) result[i] = min(result[i], a[i]);
    }
  }
  cout << -1 << endl;
  for (int i = 1; i <= n; ++i) {
    cout << result[i] << " ";
  }
  cout << endl;
  return 0;
}
