#include <bits/stdc++.h>
using namespace std;
inline long long mod(long long n, long long m) {
  long long ret = n % m;
  if (ret < 0) ret += m;
  return ret;
}
long long gcd(long long a, long long b) {
  return (b == 0LL ? a : gcd(b, a % b));
}
long long exp(long long a, long long b, long long m) {
  if (b == 0LL) return 1LL;
  if (b == 1LL) return mod(a, m);
  long long k = mod(exp(a, b / 2, m), m);
  if (b & 1LL) {
    return mod(a * mod(k * k, m), m);
  } else
    return mod(k * k, m);
}
const int N = 660;
vector<int> g[N];
vector<int> nada;
map<vector<int>, int> cache;
int ask(vector<int> v) {
  sort(v.begin(), v.end());
  int k = (int)v.size();
  if ((int)v.size() == 1) return 0;
  if (cache.count(v)) return cache[v];
  cout << "? " << k << "\n";
  for (int x : v) cout << x << " ";
  cout << "\n";
  cout.flush();
  int m;
  cin >> m;
  if (m == -1) {
    exit(0);
  }
  return cache[v] = m;
}
int vis[N];
int ed;
int n;
struct dsu {
  vector<int> p, ps;
  dsu(int n) {
    p = vector<int>(n + 1), ps = vector<int>(n + 1, 1);
    for (int i = 0; i < (n + 1); ++i) p[i] = i;
  }
  int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); }
  bool join(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return 0;
    if (ps[x] > ps[y]) swap(x, y);
    p[x] = y, ps[y] += ps[x];
    return 1;
  }
};
dsu D(N);
void addEdge(int a, int b) {
  g[a].push_back(b);
  g[b].push_back(a);
  ed++;
  assert(ed < n);
}
void go(int id, vector<int> cur) {
  int tam = (int)cur.size();
  if (tam == 0) return;
  if (tam == 1) {
    if (D.find(id) == D.find(cur[0])) return;
    cur.push_back(id);
    int m = ask(cur);
    if (m == 1) {
      D.join(id, cur[0]);
      addEdge(id, cur[0]);
    }
    return;
  }
  vector<int> L, R;
  for (int i = 0; i < tam / 2; i++) {
    L.push_back(cur[i]);
  }
  if ((int)L.size()) {
    int m1 = ask(L);
    vector<int> aux = L;
    aux.push_back(id);
    int m11 = ask(aux);
    if (m1 != m11) {
      go(id, L);
    }
  }
  for (int i = tam / 2; i < (int)cur.size(); i++) {
    R.push_back(cur[i]);
  }
  cur.clear();
  if ((int)R.size()) {
    int m1 = ask(R);
    vector<int> aux = R;
    aux.push_back(id);
    int m11 = ask(aux);
    if (m1 != m11) {
      go(id, R);
    }
  }
  return;
}
vector<int> cor[2];
int pai[N];
int H[N];
vector<int> path(int a, int b) {
  vector<int> vL, vR;
  while (a != b) {
    if (H[a] > H[b]) {
      vL.push_back(a);
      a = pai[a];
    } else if (H[b] > H[a]) {
      vR.push_back(b);
      b = pai[b];
    } else {
      vL.push_back(a);
      a = pai[a];
    }
  }
  vector<int> ans;
  vL.push_back(a);
  for (int x : vL) ans.push_back(x);
  reverse(vR.begin(), vR.end());
  for (int x : vR) ans.push_back(x);
  return ans;
}
void vai(vector<int> v, int tot) {
  if ((int)v.size() <= 1 or tot == 0) return;
  vector<int> L, R;
  int tam = (int)v.size();
  for (int i = 0; i < tam / 2; i++) {
    L.push_back(v[i]);
  }
  for (int i = tam / 2; i < tam; i++) {
    R.push_back(v[i]);
  }
  v.clear();
  int m1 = ask(L);
  int m2 = ask(R);
  if (m1 + m2 == tot) {
    vai(L, m1);
    vai(R, m2);
    return;
  }
  assert((int)R.size() > 0);
  for (int x : L) {
    vector<int> aux = R;
    aux.push_back(x);
    int mn = ask(aux);
    if (mn == m2) continue;
    while ((int)R.size() > 1) {
      int mid = (int)R.size() / 2;
      vector<int> v1, v2;
      for (int i = 0; i < mid; i++) {
        v1.push_back(R[i]);
      }
      for (int i = mid; i < (int)R.size(); i++) {
        v2.push_back(R[i]);
      }
      aux = v1;
      aux.push_back(x);
      int t1 = ask(v1);
      int t2 = ask(aux);
      if (t1 < t2) {
        R = v1;
      } else
        R = v2;
    }
    int ca = x, cb = R[0];
    assert(D.find(ca) == D.find(cb));
    vector<int> cic = path(ca, cb);
    cout << "N " << (int)cic.size() << "\n";
    for (int y : cic) cout << y << " ";
    cout << "\n";
    exit(0);
  }
}
void tenta(int c) {
  if ((int)cor[c].size() == 0) return;
  int m = ask(cor[c]);
  if (m == 0) return;
  vai(cor[c], m);
}
int tt = 0;
vector<int> vec;
int comp = 0;
void dfs(int v, int c, int p) {
  cor[c].push_back(v);
  tt++;
  vec.push_back(v);
  vis[v] = 1;
  if (tt > N) exit(0);
  for (int to : g[v]) {
    if (to != p) {
      pai[to] = v;
      H[to] = H[v] + 1;
      dfs(to, 1 - c, v);
    }
  }
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    nada.clear();
    for (int j = 1; j <= n; j++)
      if (D.find(i) != D.find(j)) nada.push_back(j);
    go(i, nada);
  }
  for (int i = 1; i <= n; i++) {
    vis[i] = 0;
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      H[i] = 1;
      pai[i] = 0;
      vec.clear();
      dfs(i, 0, i);
      int cnt = 0;
      for (int x : vec) cnt += (H[x] == 1);
      assert(cnt == 1);
      vector<int> mark(n + 1, 0);
      int aqui = i;
      for (int x : vec) {
        mark[x] = 1;
        assert(D.find(aqui) == D.find(i));
      }
      for (int j = 1; j <= n; j++) {
        if (!mark[j]) {
          assert(D.find(j) != D.find(i));
        }
      }
      for (int x : vec) {
        int cur = x;
        while (cur != i and cur > 0) cur = pai[cur];
        assert(cur == i);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    assert(H[i] == H[pai[i]] + 1);
  }
  tenta(0);
  tenta(1);
  if ((int)cor[0].size() < (int)cor[1].size()) swap(cor[0], cor[1]);
  cout << "Y " << (int)cor[0].size() << "\n";
  for (int x : cor[0]) cout << x << " ";
  cout << "\n";
}
