Fox Ciel wants to write a task for a programming contest. The task is: "You are given a simple undirected graph with n vertexes. Each its edge has unit length. You should calculate the number of shortest paths between vertex 1 and vertex 2."

Same with some writers, she wants to make an example with some certain output: for example, her birthday or the number of her boyfriend. Can you help her to make a test case with answer equal exactly to k?

Input

The first line contains a single integer k (1 ≤ k ≤ 109).

Output

You should output a graph G with n vertexes (2 ≤ n ≤ 1000). There must be exactly k shortest paths between vertex 1 and vertex 2 of the graph.

The first line must contain an integer n. Then adjacency matrix G with n rows and n columns must follow. Each element of the matrix must be 'N' or 'Y'. If Gij is 'Y', then graph G has a edge connecting vertex i and vertex j. Consider the graph vertexes are numbered from 1 to n.

The graph must be undirected and simple: Gii = 'N' and Gij = Gji must hold. And there must be at least one path between vertex 1 and vertex 2. It's guaranteed that the answer exists. If there multiple correct answers, you can output any of them. 

Examples

Input

2

Output

4
NNYY
NNYY
YYNN
YYNN

Input

9

Output

8
NNYYYNNN
NNNNNYYY
YNNNNYYY
YNNNNYYY
YNNNNYYY
NYYYYNNN
NYYYYNNN
NYYYYNNN

Input

1

Output

2
NY
YN

Note

In first example, there are 2 shortest paths: 1-3-2 and 1-4-2.

In second example, there are 9 shortest paths: 1-3-6-2, 1-3-7-2, 1-3-8-2, 1-4-6-2, 1-4-7-2, 1-4-8-2, 1-5-6-2, 1-5-7-2, 1-5-8-2.
#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream &operator<<(ostream &os, vector<T> V) {
  os << "[ ";
  for (auto v : V) os << v << " ";
  os << "]";
  return os;
}
template <class T>
ostream &operator<<(ostream &os, set<T> S) {
  os << "{ ";
  for (auto s : S) os << s << " ";
  return os << "}";
}
template <class L, class R>
ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
template <class L, class R>
ostream &operator<<(ostream &os, map<L, R> M) {
  os << "{ ";
  for (auto m : M) os << "(" << m.first << ":" << m.second << ") ";
  return os << "}";
}
const long long N = 10005;
bool b[N][N];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long k, l = 0, n = 0, len = 0;
  cin >> k;
  if (k == 1) {
    cout << 2 << '\n';
    cout << "NY\nYN\n";
    return 0;
  }
  if (k == 2) {
    cout << 4 << '\n';
    cout << "NNYY\nNNYY\nYYNN\nYYNN\n";
    return 0;
  }
  long long cur = 3, last = 0;
  while (k) {
    long long x = 1, c = 3;
    while (x <= k) x *= c++;
    c--;
    x /= c;
    c--;
    if (x == 1) c = 2;
    k -= x;
    len = max(len, c);
    vector<long long> v;
    v.push_back(1);
    long long cur1 = 3;
    for (long long i = 2; i < c - 1; i++) {
      vector<long long> v1;
      for (long long j = 0; j < v.size(); j++)
        for (long long k = 0; k < i + 1; k++)
          b[v[j]][cur1 + k] = 1, b[cur1 + k][v[j]] = 1;
      for (long long j = 0; j < i + 1; j++) v1.push_back(cur1 + j);
      cur1 += i + 1;
      v.clear();
      v = v1;
    }
    if (c != 2) {
      if (last == 0) last = cur1;
      vector<long long> v1;
      for (long long j = 0; j < v.size(); j++)
        for (long long k = 0; k < c; k++)
          b[v[j]][last + k] = 1, b[last + k][v[j]] = 1;
      for (long long j = 0; j < c; j++) v1.push_back(last + j);
      last += c;
      v.clear();
      v = v1;
    }
    while (c <= len) {
      if (c == len) {
        for (long long i = 0; i < v.size(); i++) b[v[i]][2] = 1, b[2][v[i]] = 1;
        break;
      }
      for (long long i = 0; i < v.size(); i++)
        b[v[i]][last] = 1, b[last][v[i]] = 1;
      last++;
      v.clear();
      v.push_back(last - 1);
      c++;
    }
  }
  last--;
  cout << last << '\n';
  for (long long i = 1; i < last + 1; i++) {
    for (long long j = 1; j < last + 1; j++) {
      if (b[i][j])
        cout << 'Y';
      else
        cout << 'N';
    }
    cout << '\n';
  }
  return 0;
}
