#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e5 + 7;
vector<long long> vt[maxn], type[3];
long long col[maxn], par[maxn], n, u[maxn], v[maxn], m;
bool found, d2[maxn], dd[maxn];
long long ask(vector<long long> a) {
  if (a.size() <= 1) return 0;
  cout << "? " << a.size() << endl;
  for (auto i : a) cout << i << ' ';
  cout << endl;
  fflush(stdout);
  long long x;
  cin >> x;
  return x;
}
void buildtree() {
  queue<long long> q;
  q.push(1);
  d2[1] = 1;
  while (q.size()) {
    long long u = q.front();
    q.pop();
    vector<long long> candidates(0);
    for (long long i = 1; i <= n; i++) {
      if (!d2[i]) {
        candidates.push_back(i);
      }
    }
    if (candidates.size() == 0) break;
    long long last = (long long)candidates.size() - 1;
    while (last >= 0) {
      long long l = 0;
      long long r = last;
      while (l <= r) {
        long long mid = l + r >> 1;
        vector<long long> cc0(0), cc1 = {u};
        for (long long i = last; i >= mid; i--) {
          cc0.push_back(candidates[i]);
          cc1.push_back(candidates[i]);
        }
        if (ask(cc1) - ask(cc0)) {
          l = mid + 1;
        } else
          r = mid - 1;
      }
      if (r == -1) break;
      vt[u].push_back(candidates[r]);
      vt[candidates[r]].push_back(u);
      d2[candidates[r]] = 1;
      last = r - 1;
      q.push(candidates[r]);
    }
  }
}
void dfs(long long u) {
  for (auto i : vt[u]) {
    if (col[i] == 0) {
      col[i] = 3 - col[u];
      dfs(i);
    }
  }
}
void trace(long long u, long long p) {
  for (auto v : vt[u]) {
    if (v != p) {
      par[v] = u;
      trace(v, u);
    }
  }
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  if (fopen("test.inp", "r"))
    freopen("test.inp", "r", stdin), freopen("test.out", "w", stdout);
  cin >> n;
  buildtree();
  col[1] = 1;
  dfs(1);
  for (long long i = 1; i <= n; i++) {
    type[col[i]].push_back(i);
  }
  long long a1 = ask(type[1]);
  long long a2 = ask(type[2]);
  if (a1 == 0 && a2 == 0) {
    cout << "Y " << type[1].size() << endl;
    for (auto i : type[1]) cout << i << ' ';
    cout << endl;
    fflush(stdout);
    exit(0);
  }
  long long cc, onepath;
  if (a1 > 0)
    cc = 1;
  else
    cc = 2;
  for (auto i : type[cc]) {
    vector<long long> cac(0);
    for (auto j : type[cc]) {
      if (j != i) cac.push_back(j);
    }
    if (ask(type[cc]) - ask(cac)) {
      long long l = 0;
      long long r = cac.size() - 1;
      while (l <= r) {
        long long mid = l + r >> 1;
        vector<long long> toAsk1 = {i}, toAsk0(0);
        for (long long i = 0; i <= mid; i++) {
          toAsk1.push_back(cac[i]);
          toAsk0.push_back(cac[i]);
        }
        if (ask(toAsk1) - ask(toAsk0))
          r = mid - 1;
        else
          l = mid + 1;
      }
      long long j = cac[l];
      trace(i, i);
      vector<long long> ans(0);
      while (true) {
        ans.push_back(j);
        if (j == i) break;
        j = par[j];
      }
      cout << "N " << ans.size() << endl;
      for (auto i : ans) cout << i << " ";
      cout << endl;
      fflush(stdout);
      exit(0);
    }
  }
}
