#include <bits/stdc++.h>   using namespace std;   template <typename T1, typename T2>   ostream& operator<<(ostream& os, const pair<T1, T2>& p) {     os <<  (  << p.first <<  ,   << p.second <<  ) ;     return os;   }   template <typename T1, typename T2, typename T3>   ostream& operator<<(ostream& os, const tuple<T1, T2, T3>& t) {     os <<  (  << get<0>(t) <<  ,   << get<1>(t) <<  ,   << get<2>(t) <<  ) ;     return os;   }   template <typename T1, typename T2, typename T3, typename T4>   ostream& operator<<(ostream& os, const tuple<T1, T2, T3, T4>& t) {     os <<  (  << get<0>(t) <<  ,   << get<1>(t) <<  ,   << get<2>(t) <<  ,          << get<3>(t) <<  ) ;     return os;   }   template <typename T>   ostream& operator<<(ostream& os, const vector<T>& v) {     os <<  [ ;     for (auto it = v.begin(); it != v.end(); it++) {       if (it != v.begin()) os <<  ,  ;       os << *it;     }     os <<  ] ;     return os;   }   template <typename T, typename C>   ostream& operator<<(ostream& os, const set<T, C>& v) {     os <<  { ;     for (auto it = v.begin(); it != v.end(); it++) {       if (it != v.begin()) os <<  ,  ;       os << *it;     }     os <<  } ;     return os;   }   template <typename T, typename C>   ostream& operator<<(ostream& os, const unordered_set<T, C>& v) {     os <<  { ;     for (auto it = v.begin(); it != v.end(); it++) {       if (it != v.begin()) os <<  ,  ;       os << *it;     }     os <<  } ;     return os;   }   template <typename T, typename C>   ostream& operator<<(ostream& os, const multiset<T, C>& v) {     os <<  { ;     for (auto it = v.begin(); it != v.end(); it++) {       if (it != v.begin()) os <<  ,  ;       os << *it;     }     os <<  } ;     return os;   }   template <typename T1, typename T2, typename C>   ostream& operator<<(ostream& os, const map<T1, T2, C>& mp) {     os <<  [ ;     for (auto it = mp.begin(); it != mp.end(); it++) {       if (it != mp.begin()) os <<  ,  ;       os << it->first <<  :   << it->second;     }     os <<  ] ;     return os;   }   template <typename T1, typename T2, typename C>   ostream& operator<<(ostream& os, const unordered_map<T1, T2, C>& mp) {     os <<  [ ;     for (auto it = mp.begin(); it != mp.end(); it++) {       if (it != mp.begin()) os <<  ,  ;       os << it->first <<  :   << it->second;     }     os <<  ] ;     return os;   }   template <typename T, typename T2>   ostream& operator<<(ostream& os, const queue<T, T2>& orig) {     queue<T, T2> que(orig);     bool first = true;     os <<  [ ;     while (!que.empty()) {       T x = que.front();       que.pop();       if (!first) os <<  ,  ;       os << x;       first = false;     }     return os <<  ] ;   }   template <typename T, typename T2>   ostream& operator<<(ostream& os, const deque<T, T2>& orig) {     deque<T, T2> que(orig);     bool first = true;     os <<  [ ;     while (!que.empty()) {       T x = que.front();       que.pop_front();       if (!first) os <<  ,  ;       os << x;       first = false;     }     return os <<  ] ;   }   template <typename T, typename T2, typename T3>   ostream& operator<<(ostream& os, const priority_queue<T, T2, T3>& orig) {     priority_queue<T, T2, T3> pq(orig);     bool first = true;     os <<  [ ;     while (!pq.empty()) {       T x = pq.top();       pq.pop();       if (!first) os <<  ,  ;       os << x;       first = false;     }     return os <<  ] ;   }   template <typename T>   ostream& operator<<(ostream& os, const stack<T>& st) {     stack<T> tmp(st);     os <<  [ ;     bool first = true;     while (!tmp.empty()) {       T& t = tmp.top();       if (first)         first = false;       else         os <<  ,  ;       os << t;       tmp.pop();     }     os <<  ] ;     return os;   }   ostream& operator<<(ostream& os, int8_t x) {     os << (int32_t)x;     return os;   }   template <class... Args>   string dbgFormat(const char* fmt, Args... args) {     size_t len = snprintf(nullptr, 0, fmt, args...);     char buf[len + 1];     snprintf(buf, len + 1, fmt, args...);     return string(buf);   }   template <class Head>   void dbgLog(Head&& head) {     cerr << head << endl;   }   template <class Head, class... Tail>   void dbgLog(Head&& head, Tail&&... tail) {     cerr << head <<    ;     dbgLog(forward<Tail>(tail)...);   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     cout << setprecision(20);     long long int n;     cin >> n;     const long long int big = 1e10;     vector<long long int> ans(n + 1, big);     long long int lim = 10;     for (long long int t = 0; t < lim; t++) {       ;       auto doit = [&](long long int bit) -> void {         vector<long long int> vec;         for (long long int i = 1; i <= n; i++) {           if (((i >> t) & 1) == bit) vec.push_back(i);         };         long long int sz = vec.size();         if (sz == 0) return;         cout << sz << endl;         for (long long int i = 0; i < sz; i++) {           if (i > 0) cout <<    ;           cout << vec[i];         }         cout << endl;         for (long long int i = 1; i <= n; i++) {           long long int v;           cin >> v;           if (((i >> t) & 1) != bit) {             ans[i] = min(ans[i], v);             ;           }         }       };       doit(0);       doit(1);     }     cout << -1 << endl;     for (long long int i = 1; i <= n; i++) {       if (i > 0) cout <<    ;       cout << ans[i];     }     cout << endl;     return 0;   }