Problem: 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.

Solution (in JAVA):

Solution:
import static java.lang.System.in;
import static java.lang.System.out;

import java.io.*;
import java.util.*;

public class Main {
	static final double EPS = 1e-10;
	static final double INF = 1 << 31;
	static final double PI = Math.PI;

	public static Scanner sc = new Scanner(in);
	StringBuilder sb = new StringBuilder();
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	int [][] a;
	int dim;
	int source;
	int sink;


	public void run() throws IOException {
		String input;
		input = br.readLine();
		int k = Integer.valueOf(input);

		int len = input.length();
		dim = 2 + len*10;
		int n =k;
		for (int i=len-1; i>=0; i--){
			dim += i*(n%10);
			n/=10;
		}
		a = new int[dim][dim];
		int s=10;  //last node so far 
		for (int i=1; i<len; i++){
			for (int p=s-10; p<s; p++)
				for (int j=s; j<s+10; j++)
					connect(p,j);
			s+=10;
		}
		source = dim-2;
		sink = dim-1;
		//connect to source
		for (int i=0; i<10; i++)
			connect(i,source);
		//connect to sink
		n=k;
		for (int i=len-1; i>=0; i--){
			for (int p=0; p<n%10; p++){
				toSink(i, s, (len-i-1)*10+p);
				s += i;
			}
			n/=10;
		}
		
		swap(0,source);
		swap(1,sink);
		
		//print
		sb.append(dim+"\n");
		for (int i=0; i<dim; i++){
			for (int j=0; j<dim; j++)
				if (a[i][j]==1) sb.append("Y");
				else sb.append("N");
			sb.append("\n");
		}
		ln(sb);
	}

	private void toSink(int len, int s, int i) {
		int pre = i;
		for (int p=0; p<len; p++){
			connect(pre,s);
			pre=s;
			s++;
		}
		connect(pre,sink);
	}

	private void swap(int r1, int r2) {
		for (int i=0; i<dim; i++){
			int x = a[i][r1];
			a[i][r1] =a[i][r2];
			a[i][r2] = x;
		}
		for (int i=0; i<dim; i++){
			int x = a[r1][i];
			a[r1][i] =a[r2][i];
			a[r2][i] = x;
		}
		
	}

	private void connect(int p, int j) {
		a[p][j] = 1;
		a[j][p] = 1;	
	}

	public static void main(String[] args) throws IOException {
		new Main().run();
	}
	public static void ln(Object obj) {
		out.print(obj);
	}
}