#include <bits/stdc++.h>
using namespace std;
const int INF = INT_MAX;
const long long INFL = LLONG_MAX;
const long double pi = acos(-1);
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y); }
int lcm(int x, int y) { return x * y / (gcd(x, y)); }
class ufo {
 private:
  vector<int> p, rnk, ss;
  int ns;

 public:
  ufo(int N) {
    ss.assign(N, 1);
    ns = N;
    rnk.assign(N, 0);
    p.assign(N, 0);
    for (int i = 0; i < N; i++) p[i] = i;
  }
  int findSet(int i) { return (p[i] == i) ? i : (p[i] = findSet(p[i])); }
  bool isSameSet(int i, int j) { return findSet(i) == findSet(j); }
  void unionSet(int i, int j) {
    if (!isSameSet(i, j)) {
      ns--;
      int x = findSet(i), y = findSet(j);
      if (rnk[x] > rnk[y]) {
        p[y] = x;
        ss[x] += ss[y];
      } else {
        p[x] = y;
        ss[y] += ss[x];
        if (rnk[x] == rnk[y]) rnk[y]++;
      }
    }
  }
  int nds() { return ns; }
  int sizeOfSet(int i) { return ss[findSet(i)]; }
};
long long minsetb[1024][22], minnsetb[1024][22];
int main() {
  int n;
  cin >> n;
  for (int bit = 0; (1 << bit) < n; bit++) {
    vector<int> setb, nsetb;
    for (int pos = 0; pos < n; pos++) {
      if (pos & (1 << bit))
        setb.push_back(pos);
      else
        nsetb.push_back(pos);
    }
    ostringstream os;
    os << int((setb).size()) << '\n';
    for (int(i) = 0; (i) < (int((setb).size())); (i)++)
      os << setb[i] + 1 << " ";
    os << '\n';
    cout << os.str();
    fflush(stdout);
    os.str("");
    os.clear();
    for (int(pos) = 0; (pos) < (n); (pos)++) {
      long long x;
      cin >> x;
      minsetb[pos][bit] = x;
    }
    os << int((nsetb).size()) << '\n';
    for (int(i) = 0; (i) < (int((nsetb).size())); (i)++)
      os << nsetb[i] + 1 << " ";
    os << '\n';
    cout << os.str();
    fflush(stdout);
    for (int(pos) = 0; (pos) < (n); (pos)++) {
      long long x;
      cin >> x;
      minnsetb[pos][bit] = x;
    }
  }
  ostringstream os;
  for (int(row) = 0; (row) < (n); (row)++) {
    long long ans = INFL;
    for (int bit = 0; (1 << bit) < n; bit++) {
      if (row & (1 << bit))
        ans = min(ans, minnsetb[row][bit]);
      else
        ans = min(ans, minsetb[row][bit]);
    }
    os << ans << " ";
  }
  cout << -1 << "\n" << os.str() << '\n';
  fflush(stdout);
}
