Problem: Petya learned a new programming language CALPAS. A program in this language always takes one non-negative integer and returns one non-negative integer as well.

In the language, there are only three commands: apply a bitwise operation AND, OR or XOR with a given constant to the current integer. A program can contain an arbitrary sequence of these operations with arbitrary constants from 0 to 1023. When the program is run, all operations are applied (in the given order) to the argument and in the end the result integer is returned.

Petya wrote a program in this language, but it turned out to be too long. Write a program in CALPAS that does the same thing as the Petya's program, and consists of no more than 5 lines. Your program should return the same integer as Petya's program for all arguments from 0 to 1023.

Input

The first line contains an integer n (1 ≤ n ≤ 5·105) — the number of lines.

Next n lines contain commands. A command consists of a character that represents the operation ("&", "|" or "^" for AND, OR or XOR respectively), and the constant xi 0 ≤ xi ≤ 1023.

Output

Output an integer k (0 ≤ k ≤ 5) — the length of your program.

Next k lines must contain commands in the same format as in the input.

Examples

Input

3
| 3
^ 2
| 1


Output

2
| 3
^ 2


Input

3
&amp; 1
&amp; 3
&amp; 5


Output

1
&amp; 1


Input

3
^ 1
^ 2
^ 3


Output

0

Note

You can read about bitwise operations in <https://en.wikipedia.org/wiki/Bitwise_operation>.

Second sample:

Let x be an input of the Petya's program. It's output is ((x&1)&3)&5 = x&(1&3&5) = x&1. So these two programs always give the same outputs.

Solution (in JAVA):

Solution:
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();

		char c[][] = new char[n][10];

		for (int i = 0; i < n; i++) {
			String sTemp = sc.next();
			char cTemp = sTemp.charAt(0);
			int numTemp = sc.nextInt();
			for (int digit = 0; digit < 10; digit++) {
				if (numTemp % 2 == 0 && cTemp == '&') {
					c[i][digit] = '&';
				} else if (numTemp % 2 == 1 && cTemp == '|') {
					c[i][digit] = '|';
				} else if (numTemp % 2 == 1 && cTemp == '^') {
					c[i][digit] = '^';
				} else {
					c[i][digit] = '.';
				}
				numTemp /= 2;
			}
		}

		int[][] test = new int[10][2];
		for (int digit = 0; digit < 10; digit++) {
			test[digit][0] = 0;
			test[digit][1] = 1;
		}
		for (int i = 0; i < n; i++) {
			for (int digit = 0; digit < 10; digit++) {
				for (int j = 0; j < 2; j++) {
					if (c[i][digit] == '&' && test[digit][j] == 1) {
						test[digit][j] = 0;
					} else if (c[i][digit] == '|' && test[digit][j] == 0) {
						test[digit][j] = 1;
					} else if (c[i][digit] == '^' && test[digit][j] == 1) {
						test[digit][j] = 0;
					} else if (c[i][digit] == '^' && test[digit][j] == 0) {
						test[digit][j] = 1;
					}
				}
			}
		}

		for (int digit = 0; digit < 10; digit++) {
			// System.out.println(test[digit][0] + " " + test[digit][1]);
		}

		boolean[] and = new boolean[10];
		boolean[] or = new boolean[10];
		boolean[] xor = new boolean[10];
		boolean and1 = false;
		boolean or1 = false;
		boolean xor1 = false;
		for (int digit = 0; digit < 10; digit++) {
			and[digit] = false;
			or[digit] = false;
			xor[digit] = false;
		}

		for (int digit = 0; digit < 10; digit++) {
			if (test[digit][0] == 0 && test[digit][1] == 1) {
				// なにもしない
			} else if (test[digit][0] == 0 && test[digit][1] == 0) {
				and[digit] = true;
				and1 = true;
			} else if (test[digit][0] == 1 && test[digit][1] == 0) {
				xor[digit] = true;
				xor1 = true;
			} else if (test[digit][0] == 1 && test[digit][1] == 1) {
				or[digit] = true;
				or1 = true;
			}
		}

		int num = 1;
		int andNum = 0;
		int orNum = 0;
		int xorNum = 0;
		for (int digit = 0; digit < 10; digit++) {
			if (and1) {
				if (!and[digit]) {
					andNum += num;
				}
			}
			if (or1) {
				if (or[digit]) {
					orNum += num;
				}
			}
			if (xor1) {
				if (xor[digit]) {
					xorNum += num;
				}
			}
			num *= 2;
		}

		if (and1 && or1 && xor1) {
			System.out.println(3);
		} else if (!and1 && or1 && xor1) {
			System.out.println(2);
		} else if (and1 && !or1 && xor1) {
			System.out.println(2);
		} else if (and1 && or1 && !xor1) {
			System.out.println(2);
		} else if (!and1 && !or1 && xor1) {
			System.out.println(1);
		} else if (and1 && !or1 && !xor1) {
			System.out.println(1);
		} else if (!and1 && or1 && !xor1) {
			System.out.println(1);
		} else if (!and1 && !or1 && !xor1) {
			System.out.println(0);
		}

		if (and1) {
			System.out.println('&' + " " + andNum);
		}
		if (or1) {
			System.out.println('|' + " " + orNum);
		}
		if (xor1) {
			System.out.println('^' + " " + xorNum);
		}

	}

}