#include <bits/stdc++.h>
using namespace std;
bool check(long long n, long long pos) { return n & (1LL << pos); }
long long Set(long long n, long long pos) { return n = n | (1LL << pos); }
char grid[1003][1003];
void conn(long long i, long long j) {
  grid[i][j] = 'Y';
  grid[j][i] = 'Y';
}
long long point[100];
int main() {
  long long i, j, k, l, m, n, o, r, q;
  long long testcase;
  long long input, flag, tag, ans;
  while (cin >> k) {
    for (i = 1; i <= 1000; i++)
      for (j = 1; j <= 1000; j++) grid[i][j] = 'N';
    long long mxbit = 0;
    for (i = 0; i <= 30; i++) point[i] = 0;
    conn(1, 3);
    long long node = 2;
    for (i = 30; i >= 0; i--) {
      if (check(k, i) == 0) continue;
      mxbit = max(mxbit, i);
      node++;
      if (i == mxbit) {
        for (j = 0; j < i; j++) {
          conn(node, node + 1);
          conn(node, node + 2);
          conn(node + 2, node + 3);
          conn(node + 1, node + 3);
          point[j] = node + 1;
          node += 3;
        }
        conn(node, 2);
      } else {
        conn(node, point[i]);
        for (j = i + 1; j < mxbit; j++) {
          conn(node, node + 1);
          conn(node + 1, node + 2);
          node += 2;
        }
        conn(node, 2);
      }
    }
    assert(1 <= node && node <= 871);
    cout << node << "\n";
    for (i = 1; i <= node; i++) {
      for (j = 1; j <= node; j++) {
        printf("%c", grid[i][j]);
      }
      printf("\n");
    }
  }
}
