#include <bits/stdc++.h>
using namespace std;
const int maxn = 605;
int nask(vector<int> tmp) {
  if (!tmp.size() || tmp.size() == 1) return 0;
  cout << "? " << tmp.size() << endl;
  for (int i = (0), iend = ((int)tmp.size() - 1); i <= iend; i++)
    cout << tmp[i] << ' ';
  cout << endl;
  cout.flush();
  int ans;
  cin >> ans;
  if (ans == -1) exit(0);
  return ans;
}
int dask(int u, vector<int> tar) {
  int cntsig = nask(tar);
  tar.push_back(u);
  int cnttot = nask(tar);
  return cnttot - cntsig;
}
int n;
bool vis[maxn];
int bl[maxn];
int find(int u, vector<int> tmp) {
  vector<int> c1, c2;
  if (tmp.size() == 1) return tmp[0];
  for (int i = (0), iend = ((int)(tmp.size()) - 1); i <= iend; i++) {
    if (c1.size() < tmp.size() / 2)
      c1.push_back(tmp[i]);
    else
      c2.push_back(tmp[i]);
  }
  if (dask(u, c1))
    return find(u, c1);
  else
    return find(u, c2);
}
vector<int> half[2];
vector<int> side[maxn];
void dfs(int u) {
  half[bl[u]].push_back(u);
  while (1) {
    vector<int> tmp;
    for (int i = (1), iend = (n); i <= iend; i++)
      if (!vis[i]) tmp.push_back(i);
    if (dask(u, tmp) == 0) return;
    int tar = find(u, tmp);
    side[u].push_back(tar);
    side[tar].push_back(u);
    vis[tar] = 1;
    bl[tar] = bl[u] ^ 1;
    dfs(tar);
  }
}
int stk[maxn], top;
vector<int> ans;
void cfs(int u, int tar) {
  stk[++top] = u;
  if (u == tar) {
    for (int i = (1), iend = (top); i <= iend; i++) ans.push_back(stk[i]);
    return;
  }
  for (int i = (0), iend = (side[u].size() - 1); i <= iend; i++) {
    int v = side[u][i];
    if (!vis[v]) {
      vis[v] = 1;
      cfs(v, tar);
    }
  }
  top--;
}
void ans_out(int u, int v) {
  memset(vis, 0, sizeof(vis));
  vis[u] = 1;
  cfs(u, v);
  cout << "N " << ans.size() << endl;
  for (int i = (0), iend = ((int)(ans.size()) - 1); i <= iend; i++)
    cout << ans[i] << ' ';
  return;
}
int main() {
  ios::sync_with_stdio(0);
  cin >> n;
  vis[1] = 1;
  dfs(1);
  if (!nask(half[0]) && !nask(half[1])) {
    cout << "Y " << half[0].size() << endl;
    for (int i = (0), iend = ((int)(half[0].size()) - 1); i <= iend; i++)
      cout << half[0][i] << ' ';
    return 0;
  } else {
    for (int i = (0), iend = (1); i <= iend; i++)
      for (int j = (0), jend = ((int)(half[i].size()) - 1); j <= jend; j++) {
        vector<int> tmp;
        int u = half[i][j];
        for (int k = (0), kend = ((int)(half[i].size()) - 1); k <= kend; k++)
          if (half[i][k] != u) tmp.push_back(half[i][k]);
        if (dask(u, tmp)) {
          for (int k = (0), kend = ((int)(tmp.size()) - 1); k <= kend; k++) {
            vector<int> gg;
            gg.push_back(u);
            gg.push_back(tmp[k]);
            if (nask(gg)) {
              ans_out(u, tmp[k]);
              return 0;
            }
          }
        }
      }
  }
}
