#include <bits/stdc++.h>
using namespace std;
const int N = 6e3 + 2;
int level[N], in[N], out[N], now = 0, par[N];
vector<int> lis, lis1;
map<vector<int>, int> ans;
map<pair<vector<int>, vector<int> >, pair<int, int> > ans_num;
vector<int> adj[N];
bool used[N];
int ask(vector<int> s) {
  sort(s.begin(), s.end());
  if (s.size() == 1) {
    return 0;
  }
  if (ans.count(s)) {
    return ans[s];
  }
  cout << "? " << s.size() << '\n';
  for (int i = 0; i < s.size(); i++) {
    cout << s[i] << ' ';
  }
  cout << endl;
  int x;
  cin >> x;
  ans[s] = x;
  return x;
}
int num(vector<int> x, vector<int> y) {
  vector<int> temp;
  for (int i = 0; i < x.size(); i++) {
    temp.push_back(x[i]);
  }
  for (int i = 0; i < y.size(); i++) {
    temp.push_back(y[i]);
  }
  return ask(temp) - ask(x) - ask(y);
}
pair<int, int> process(vector<int> x, vector<int> y) {
  if (x.size() == 1 && y.size() == 1) {
    return {x[0], y[0]};
  }
  if (ans_num.count({x, y})) {
    return ans_num[{x, y}];
  }
  if (y.size() > 1) {
    vector<int> y1, y2;
    for (int i = 0; i < y.size(); i++) {
      if (i < y.size() / 2) {
        y1.push_back(y[i]);
      } else {
        y2.push_back(y[i]);
      }
    }
    if (num(x, y1) > 0) {
      ans_num[{x, y}] = process(x, y1);
    } else {
      ans_num[{x, y}] = process(x, y2);
    }
  } else {
    vector<int> x1, x2;
    for (int i = 0; i < x.size(); i++) {
      if (i < x.size() / 2) {
        x1.push_back(x[i]);
      } else {
        x2.push_back(x[i]);
      }
    }
    if (num(x1, y) > 0) {
      ans_num[{x, y}] = process(x1, y);
    } else {
      ans_num[{x, y}] = process(x2, y);
    }
  }
  return ans_num[{x, y}];
}
void dfs(int x, int p) {
  if (level[x] & 1) {
    lis.push_back(x);
  } else {
    lis1.push_back(x);
  }
  par[x] = p;
  now++;
  in[x] = now;
  for (int i : adj[x]) {
    if (i == p) {
      continue;
    }
    level[i] = level[x] + 1;
    dfs(i, x);
  }
  out[x] = now;
}
bool is_anc(int x, int y) { return in[x] <= in[y] && out[x] >= out[y]; }
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, i, j, k, l;
  cin >> n;
  if (n == 1) {
    cout << "Y 1\n1" << endl;
    return 0;
  }
  lis.push_back(1);
  used[1] = true;
  for (i = 1; i < n; i++) {
    lis1.clear();
    for (j = 1; j <= n; j++) {
      if (!used[j]) {
        lis1.push_back(j);
      }
    }
    pair<int, int> ed = process(lis, lis1);
    adj[ed.first].push_back(ed.second);
    adj[ed.second].push_back(ed.first);
    lis.push_back(ed.second);
    used[ed.second] = true;
  }
  lis.clear();
  lis1.clear();
  dfs(1, 1);
  j = ask(lis);
  k = ask(lis1);
  if (j == 0 && k == 0) {
    cout << "Y " << lis.size() << '\n';
    for (i = 0; i < lis.size(); i++) {
      cout << lis[i] << ' ';
    }
    cout << endl;
  } else {
    pair<int, int> ed;
    if (j == 0) {
      swap(lis, lis1);
    }
    lis1.clear();
    while (true) {
      lis1.push_back(lis.back());
      lis.pop_back();
      if (num(lis, lis1) > 0) {
        break;
      }
    }
    ed = process(lis, lis1);
    stack<int> cac;
    vector<int> haha;
    j = ed.first;
    k = ed.second;
    while (!is_anc(j, k)) {
      haha.push_back(j);
      j = par[j];
    }
    haha.push_back(j);
    while (j != k) {
      cac.push(k);
      k = par[k];
    }
    while (cac.size()) {
      haha.push_back(cac.top());
      cac.pop();
    }
    cout << "N " << haha.size() << '\n';
    for (i = 0; i < haha.size(); i++) {
      cout << haha[i] << ' ';
    }
    cout << endl;
  }
}
