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.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class CF

{


	static int construct(ArrayList<Integer> a,boolean zero) {
		int num = !zero ? 0 : 1023;
		for (int i = 0 ; i < a.size() ; ++i) {
			if(!zero) {
				num |= (1 << a.get(i));
			}
			else {
				num &= ~ (1 << a.get(i));
			}
		}
		return num;
	}
	public static void main(String[]args)throws Throwable
	{
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int one[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i) one[i] = 1;
		int zero[] = new int[10];
		int x = 1023;

		for(int i = 0 ; i < n ; ++i) {
			String op = sc.next();
			int num = sc.nextInt();
			if(op.equals("&")) {
				x &= num;
				for(int j = 0 ; j < 10 ; ++j) {
					zero[j] &= (num & (1 << j)) > 0 ? 1 : 0;
					one[j] &= (num & (1 << j)) > 0 ? 1 : 0;

				}
			}
			if(op.equals("|")) {
				x |= num;
				for(int j = 0 ; j < 10 ; ++j) {
					zero[j] |= (num & (1 << j)) > 0 ? 1 : 0;
					one[j] |= (num & (1 << j)) > 0 ? 1 : 0;

				}
			}
			if(op.equals("^")) {
				x ^= num;
				for(int j = 0 ; j < 10 ; ++j) {
					zero[j] ^= (num & (1 << j)) > 0 ? 1 : 0;
					one[j] ^= (num & (1 << j)) > 0 ? 1 : 0;

				}
			}
		}
		ArrayList<Integer> or = new ArrayList();
		ArrayList<Integer> and = new ArrayList();
		ArrayList<Integer> xor = new ArrayList();

		for(int i = 0 ; i < 10 ; ++i) {
			int f = 0;
			if(zero[i] == 0 && one[i] == 0) {
				and.add(i);
				f++;
			}
			if(zero[i] == 1 && one[i] == 1) {
				or.add(i);
				f++;
			}
			if(zero[i] == 1 && one[i] == 0 ) {
				xor.add(i);
				f++;
			}

			//		}
		}


		System.out.println("3");
		System.out.printf("& %d\n",construct(and,true));
		System.out.printf("^ %d\n",construct(xor,false));
		System.out.printf("| %d\n",construct(or,false));




	}

	static class Scanner
	{
		BufferedReader br;
		StringTokenizer st;


		Scanner(InputStream s)  { br = new BufferedReader(new InputStreamReader(s)); }
		public Scanner(String s) throws FileNotFoundException{	br = new BufferedReader(new FileReader(s));}


		String next() throws IOException
		{

			while(st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();

		}
		int nextInt() throws NumberFormatException, IOException { return Integer.parseInt(next()); }
		long nextLong() throws NumberFormatException, IOException { return Long.parseLong(next()); }




	}

}