#include <bits/stdc++.h>   using namespace std;   inline long long mod(long long n, long long m) {     long long ret = n % m;     if (ret < 0) ret += m;     return ret;   }   long long gcd(long long a, long long b) {     return (b == 0LL ? a : gcd(b, a % b));   }   long long exp(long long a, long long b, long long m) {     if (b == 0LL) return 1LL;     if (b == 1LL) return mod(a, m);     long long k = mod(exp(a, b / 2, m), m);     if (b & 1LL) {       return mod(a * mod(k * k, m), m);     } else       return mod(k * k, m);   }   const int N = 660;   vector<int> g[N];   vector<int> nada;   map<vector<int>, int> cache;   int ask(vector<int> v) {     sort(v.begin(), v.end());     int k = (int)v.size();     if ((int)v.size() == 1) return 0;     if (cache.count(v)) return cache[v];     cout <<  ?   << k <<   n ;     for (int x : v) cout << x <<    ;     cout <<   n ;     cout.flush();     int m;     cin >> m;     if (m == -1) {       exit(0);     }     return cache[v] = m;   }   int vis[N];   int ed;   int n;   struct dsu {     vector<int> p, ps;     dsu(int n) {       p = vector<int>(n + 1), ps = vector<int>(n + 1, 1);       for (int i = 0; i < (n + 1); ++i) p[i] = i;     }     int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); }     bool join(int x, int y) {       x = find(x), y = find(y);       if (x == y) return 0;       if (ps[x] > ps[y]) swap(x, y);       p[x] = y, ps[y] += ps[x];       return 1;     }   };   dsu D(N);   void addEdge(int a, int b) {     g[a].push_back(b);     g[b].push_back(a);     ed++;     assert(ed < n);   }   void go(int id, vector<int> cur) {     int tam = (int)cur.size();     if (tam == 0) return;     if (tam == 1) {       if (D.find(id) == D.find(cur[0])) return;       cur.push_back(id);       int m = ask(cur);       if (m == 1) {         D.join(id, cur[0]);         addEdge(id, cur[0]);       }       return;     }     vector<int> L, R;     for (int i = 0; i < tam / 2; i++) {       L.push_back(cur[i]);     }     if ((int)L.size()) {       int m1 = ask(L);       vector<int> aux = L;       aux.push_back(id);       int m11 = ask(aux);       if (m1 != m11) {         go(id, L);       }     }     for (int i = tam / 2; i < (int)cur.size(); i++) {       R.push_back(cur[i]);     }     cur.clear();     if ((int)R.size()) {       int m1 = ask(R);       vector<int> aux = R;       aux.push_back(id);       int m11 = ask(aux);       if (m1 != m11) {         go(id, R);       }     }     return;   }   vector<int> cor[2];   int pai[N];   int H[N];   vector<int> path(int a, int b) {     vector<int> vL, vR;     while (a != b) {       if (H[a] > H[b]) {         vL.push_back(a);         a = pai[a];       } else if (H[b] > H[a]) {         vR.push_back(b);         b = pai[b];       } else {         vL.push_back(a);         a = pai[a];       }     }     vector<int> ans;     vL.push_back(a);     for (int x : vL) ans.push_back(x);     reverse(vR.begin(), vR.end());     for (int x : vR) ans.push_back(x);     return ans;   }   void vai(vector<int> v, int tot) {     if ((int)v.size() <= 1 or tot == 0) return;     vector<int> L, R;     int tam = (int)v.size();     for (int i = 0; i < tam / 2; i++) {       L.push_back(v[i]);     }     for (int i = tam / 2; i < tam; i++) {       R.push_back(v[i]);     }     v.clear();     int m1 = ask(L);     int m2 = ask(R);     if (m1 + m2 == tot) {       vai(L, m1);       vai(R, m2);       return;     }     assert((int)R.size() > 0);     for (int x : L) {       vector<int> aux = R;       aux.push_back(x);       int mn = ask(aux);       if (mn == m2) continue;       while ((int)R.size() > 1) {         int mid = (int)R.size() / 2;         vector<int> v1, v2;         for (int i = 0; i < mid; i++) {           v1.push_back(R[i]);         }         for (int i = mid; i < (int)R.size(); i++) {           v2.push_back(R[i]);         }         aux = v1;         aux.push_back(x);         int t1 = ask(v1);         int t2 = ask(aux);         if (t1 < t2) {           R = v1;         } else           R = v2;       }       int ca = x, cb = R[0];       assert(D.find(ca) == D.find(cb));       vector<int> cic = path(ca, cb);       cout <<  N   << (int)cic.size() <<   n ;       for (int y : cic) cout << y <<    ;       cout <<   n ;       exit(0);     }   }   void tenta(int c) {     if ((int)cor[c].size() == 0) return;     int m = ask(cor[c]);     if (m == 0) return;     vai(cor[c], m);   }   int tt = 0;   vector<int> vec;   int comp = 0;   void dfs(int v, int c, int p) {     cor[c].push_back(v);     tt++;     vec.push_back(v);     vis[v] = 1;     if (tt > N) exit(0);     for (int to : g[v]) {       if (to != p) {         pai[to] = v;         H[to] = H[v] + 1;         dfs(to, 1 - c, v);       }     }   }   int32_t main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     ;     cin >> n;     for (int i = 1; i <= n; i++) {       nada.clear();       for (int j = 1; j <= n; j++)         if (D.find(i) != D.find(j)) nada.push_back(j);       go(i, nada);     }     for (int i = 1; i <= n; i++) {       vis[i] = 0;     }     for (int i = 1; i <= n; i++) {       if (!vis[i]) {         H[i] = 1;         pai[i] = 0;         vec.clear();         dfs(i, 0, i);         int cnt = 0;         for (int x : vec) cnt += (H[x] == 1);         assert(cnt == 1);         vector<int> mark(n + 1, 0);         int aqui = i;         for (int x : vec) {           mark[x] = 1;           assert(D.find(aqui) == D.find(i));         }         for (int j = 1; j <= n; j++) {           if (!mark[j]) {             assert(D.find(j) != D.find(i));           }         }         for (int x : vec) {           int cur = x;           while (cur != i and cur > 0) cur = pai[cur];           assert(cur == i);         }       }     }     for (int i = 1; i <= n; i++) {       assert(H[i] == H[pai[i]] + 1);     }     tenta(0);     tenta(1);     if ((int)cor[0].size() < (int)cor[1].size()) swap(cor[0], cor[1]);     cout <<  Y   << (int)cor[0].size() <<   n ;     for (int x : cor[0]) cout << x <<    ;     cout <<   n ;   }