#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (a == 0LL) return b;
  if (b == 0LL) return a;
  return gcd(b, a % b);
}
const int N = 606;
int id[N], col[N], parent[N];
bool visited[N];
vector<int> adj[N];
void dfs(int u, int p) {
  int pt;
  for (int i = 0; i < adj[u].size(); i++) {
    pt = adj[u][i];
    if (pt != p) {
      col[pt] = 1 - col[u];
      dfs(pt, u);
    }
  }
  return;
}
bool found = false;
vector<int> path;
bool mark[N];
void dfs1(int u, int p) {
  parent[u] = p;
  int pt;
  visited[u] = true;
  for (int i = 0; i < adj[u].size(); i++) {
    pt = adj[u][i];
    if (pt != p) {
      if (visited[pt]) {
        found = true;
        path.push_back(u);
        while (parent[u] != pt) {
          if (path.size() > N) assert(false);
          path.push_back(parent[u]);
          u = parent[u];
        }
        path.push_back(pt);
        return;
      }
      dfs1(pt, u);
      if (found) return;
    }
  }
  return;
}
int root(int a) {
  int ans = a;
  while (id[ans] != ans) ans = id[ans];
  int temp;
  while (id[a] != a) {
    temp = id[a];
    id[a] = ans;
    a = temp;
  }
  return ans;
}
void merge(int a, int b) {
  a = root(a);
  b = root(b);
  id[a] = b;
  return;
}
void query(vector<int> v) {
  cout << "? " << v.size() << "\n";
  for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
  cout << "\n";
  fflush(stdout);
  return;
}
void solve1(int u, vector<int> v) {
  int temp;
  if (v.size() == 1) {
    v.push_back(u);
    query(v);
    cin >> temp;
    if (temp != 0) {
      adj[u].push_back(v[0]);
      adj[v[0]].push_back(u);
      merge(v[0], u);
    }
    return;
  }
  vector<int> vl;
  vector<int> vr;
  vl.clear();
  vr.clear();
  int n = v.size() / 2;
  for (int i = 0; i < n; i++) vl.push_back(v[i]);
  for (int i = n; i < v.size(); i++) vr.push_back(v[i]);
  int cntl = 0, cntr = 0;
  query(vl);
  cin >> temp;
  vl.push_back(u);
  query(vl);
  cin >> cntl;
  cntl -= temp;
  if (cntl != 0) {
    vl.pop_back();
    solve1(u, vl);
    return;
  }
  query(vr);
  cin >> temp;
  vr.push_back(u);
  query(vr);
  cin >> cntr;
  cntr -= temp;
  if (cntr != 0) {
    vr.pop_back();
    solve1(u, vr);
    return;
  }
  mark[u] = true;
  return;
}
void solve() {
  int n;
  cin >> n;
  if (n == 1) {
    cout << "Y 1\n";
    cout << "1\n";
    fflush(stdout);
    return;
  }
  for (int i = 1; i <= n; i++) {
    id[i] = i;
    adj[i].clear();
  }
  vector<int> v;
  int total;
  while (1) {
    for (int i = 1; i <= n; i++) {
      if (mark[i]) continue;
      v.clear();
      for (int j = 1; j <= n; j++)
        if (root(j) != root(i)) v.push_back(j);
      if (v.size() != 0) solve1(i, v);
    }
    total = 0;
    for (int i = 1; i <= n; i++) total += adj[i].size();
    if (total == 2 * (n - 1)) break;
  }
  total = 0;
  for (int i = 1; i <= n; i++) total += adj[i].size();
  assert(total == 2 * (n - 1));
  col[1] = 0;
  dfs(1, 1);
  vector<int> par[2];
  for (int i = 0; i < 2; i++) par[i].clear();
  for (int i = 1; i <= n; i++) par[col[i]].push_back(i);
  bool flag = true;
  int temp, pt, val;
  query(par[0]);
  cin >> temp;
  flag = flag & (temp == 0);
  if (temp != 0) {
    pt = 0;
    val = temp;
  }
  query(par[1]);
  cin >> temp;
  flag = flag & (temp == 0);
  if (temp != 0) {
    pt = 1;
    val = temp;
  }
  if (flag) {
    cout << "Y " << par[0].size() << "\n";
    for (int i = 0; i < par[0].size(); i++) cout << par[0][i] << " ";
    cout << "\n";
    fflush(stdout);
    return;
  }
  int temp1;
  for (int i = 0; i < par[pt].size(); i++) {
    v.clear();
    for (int j = 0; j < par[pt].size(); j++) {
      if (j == i) continue;
      v.push_back(par[pt][j]);
    }
    query(v);
    cin >> temp1;
    if (temp1 == val) continue;
    solve1(par[pt][i], v);
    break;
  }
  path.clear();
  for (int i = 1; i <= n; i++) visited[i] = false;
  total = 0;
  for (int i = 1; i <= n; i++) {
    total += adj[i].size();
  }
  dfs1(1, 0);
  cout << "N " << path.size() << "\n";
  for (int i = 0; i < path.size(); i++) cout << path[i] << " ";
  cout << "\n";
  fflush(stdout);
  return;
}
int main() {
  int t = 1;
  for (int tests = 1; tests <= t; tests++) {
    solve();
  }
  return 0;
}
