#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
const size_t N = 600 + 5;
const vector<int> BLANK = vector<int>();
const ll MOD1 = 1e9 + 7;
const ll MOD2 = 1e9 + 9;
bool col[N];
int n, pa[N], dep[N];
vector<int> g[N], vert[2];
ll get_hsh(const vector<int> &vc) {
  ll hsh1 = 0, hsh2 = 0;
  for (int x : vc) {
    hsh1 = hsh1 * MOD1 + x;
    hsh2 = hsh2 * MOD2 + x;
  }
  return hsh1 * MOD2 + hsh2;
}
unordered_map<ll, int> mp;
int ask(vector<int> &vc) {
  if (vc.size() == 1) return 0;
  sort(vc.begin(), vc.end());
  ll hsh = get_hsh(vc);
  auto it = mp.find(hsh);
  if (it != mp.end()) return it->second;
  printf("? %lu\n", vc.size());
  for (int x : vc) printf("%d ", x);
  puts("");
  fflush(stdout);
  static int ans;
  scanf("%d", &ans);
  return mp[hsh] = ans;
}
int ask(const vector<int> &vc1, const vector<int> &vc2, int l, int r) {
  vector<int> vc(vc2);
  for (int i = l; i < r; ++i) {
    vc.emplace_back(vc1[i]);
  }
  return ask(vc);
}
void doit(vector<int> &vc1, vector<int> &vc2) {
  int ans2 = ask(vc2), mid, sz;
  while (vc1.size() > 1) {
    mid = (sz = vc1.size()) >> 1;
    if (ask(vc1, vc2, 0, mid) - ask(vc1, BLANK, 0, mid) - ans2 == 0) {
      for (int i = mid; i < sz; ++i) {
        vc1[i - mid] = vc1[i];
      }
      mid = sz - mid;
    }
    while (vc1.size() > mid) {
      vc1.pop_back();
    }
  }
}
int get_lca(int u, int v) {
  if (dep[u] > dep[v]) swap(u, v);
  while (dep[v] > dep[u]) {
    v = pa[v];
  }
  while (u != v) {
    u = pa[u];
    v = pa[v];
  }
  return v;
}
void get_cycle(int u, int v) {
  vector<int> ans;
  int lca = get_lca(u, v);
  for (; v != lca; v = pa[v]) {
    ans.emplace_back(v);
  }
  ans.emplace_back(lca);
  reverse(ans.begin(), ans.end());
  for (; u != lca; u = pa[u]) {
    ans.emplace_back(u);
  }
  printf("N %lu\n", ans.size());
  for (int x : ans) printf("%d ", x);
  puts("");
  fflush(stdout);
  exit(0);
}
void get_st(vector<int> &vc, bool sp = false) {
  set<int> s1, s2;
  s1.emplace(vc.front());
  for (int i = 1; i < vc.size(); ++i) {
    s2.emplace(vc[i]);
  }
  while (!s2.empty()) {
    vector<int> vc1(s1.begin(), s1.end()), vc2(s2.begin(), s2.end());
    doit(vc1, vc2);
    doit(vc2, vc1);
    if (sp && ask(vc1, vc2, 0, 1)) {
      get_cycle(vc1.front(), vc2.front());
    }
    int u = vc1.front(), v = vc2.front();
    g[u].emplace_back(v);
    g[v].emplace_back(u);
    s1.emplace(v);
    s2.erase(v);
  }
}
void paint(int v = 1, int p = 0, int d = 0, bool c = 0) {
  pa[v] = p;
  dep[v] = d;
  col[v] = c;
  vert[c].emplace_back(v);
  for (int u : g[v]) {
    if (u == p) continue;
    paint(u, v, d + 1, c ^ 1);
  }
}
int main() {
  mp.reserve(128);
  mp.max_load_factor(0.25f);
  scanf("%d", &n);
  if (n == 1) {
    return puts("Y 1\n1"), 0;
  }
  vector<int> all;
  for (int i = 1; i <= n; ++i) {
    all.emplace_back(i);
  }
  get_st(all);
  paint();
  for (int i = 0; i < 2; ++i) {
    if (ask(vert[i])) {
      get_st(vert[i], true);
    }
  }
  printf("Y %lu\n", vert[0].size());
  for (int x : vert[0]) printf("%d ", x);
  puts("");
  fflush(stdout);
  return 0;
}
