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.*;
import java.io.*;
import java.lang.Math.*;

public class MainA
{
	static int mod = (int) 1e9 + 7;
	
	public static void main(String[] args) throws java.lang.Exception
	{
		InputReader in = new InputReader(System.in);
		PrintWriter out=new PrintWriter(System.out);
		int n=in.nextInt();
		int visited[]=new int[10];
		Arrays.fill(visited,-1);
		for(int i=0;i<n;i++)
		{
			String s[]=in.nextLine().split(" ");
			int var=Integer.parseInt(s[1]);
			int  bin[]=new int[10];
		    int v = 0;
		    while(var > 0)
		    {
		    	bin[v++] = var%2;
		        var = var/2;
		    }
			if(s[0].charAt(0)=='|')
			{
				for(int j=v-1;j>=0;j--)
				{
					if(bin[j]==1)visited[j]=1;
					
				}
				//for(int j=9;j>=0;j--)out.print(visited[j]+" ");
				//out.println();
			}
			else if(s[0].charAt(0)=='&')
			{
				for(int j=9;j>=0;j--)
				{
					if(bin[j]==0)visited[j]=0;
				}
				//for(int j=9;j>=0;j--)out.print(visited[j]+" ");
				//out.println();
				//debug(i,visited);
			}
			else 
			{
				//out.println("jjjjjj");
				for(int j=v-1;j>=0;j--)
				{
					if(bin[j]==0)
					{
			
					}
					else 
					{
						if(visited[j]==-1)
						{
							visited[j]=-2;
						}
						else if(visited[j]==-2)
						{
							visited[j]=-1;
						}
						else
						{
							if(visited[j]==1)visited[j]=0;
							else visited[j]=1;
						}
					}
					
				}
			}
			
		}
		//debug(visited);
		int flag=0;
		for(int i=0;i<10;i++)
		{
			if(visited[i]==-1 || visited[i]==-2)
			{
				flag=1;
				break;
			}
		}
		if(flag==1)
		{
			int ans1=0;
			int ans2=0;
			int ans3=0;
			for(int i=0;i<10;i++)
			{
				if(visited[i]==1)
				{
					ans1+=Math.pow(2, i);
					ans2+=Math.pow(2, i);
				}
				else if(visited[i]==0)
				{
					
				}
				else if(visited[i]==-1)
				{
					ans1+=Math.pow(2, i);
				}
				else if(visited[i]==-2)
				{
					ans1+=Math.pow(2, i);
					ans3+=Math.pow(2, i);
				}
			}
			out.println(3);
			out.println("& "+ans1);
			out.println("| "+ans2);
			out.println("^ "+ans3);
			
		}
		else{
		int ans=0;
		for(int i=0;i<10;i++)
		{
			if(visited[i]==1)
			ans+=Math.pow(2,i);
		}
		
		out.println(2);
		out.println("& "+ans);
		out.println("| "+ans);}
		
		out.close();
	}

	public static class Trie
	{
		Trie []children = new Trie[26];
		int value;
		int leve;
		
		Trie()
		{
			value=1;
			for (int i = 0; i < 26; i++)
				children[i] = null;
		}
		
		public static void insert(Trie root,String key)
	    {
	        int length = key.length();
	        int index;
	      
	        Trie pCrawl = root;
	        int k=1;
	        for (int level = length-1; level >=0; level--)
	        {
	            index = key.charAt(level) - 'a';
	            if (pCrawl.children[index] == null)
	                pCrawl.children[index] = new Trie();
	            else
	            {
	            	pCrawl.children[index].value++;
	            }
	            pCrawl.children[index].leve=k++;
	            pCrawl = pCrawl.children[index];
	        }
	      
	    }
		
		public static void dfs(Trie root,int len[])
		{
			for(int i=0;i<26;i++)
			{
				if(root.children[i]!=null)
				{
					int level=root.children[i].leve;
					int value=root.children[i].value;
					len[level-1]=Math.max(len[level-1],value);
					dfs(root.children[i],len);
				}
			}
		}
	}
	public static long add(long a,long b)
	{
		return (a+b)%mod;
	}
	public static long mul(long a,long b)
	{
		return (a*b)%mod;
	}
	
	public static long sub(long a,long b)
	{
		return (a-b+mod)%mod;
	}
	static class Pairs implements Comparable<Pairs>
	{
		int x;
		int y;
		
		
		Pairs(int a, int b)
		{
			x = a;
			y = b;
			
		}

		@Override
		public boolean equals(Object o)
		{
			Pairs other=(Pairs)o;
			return x==other.x && y==other.y;
		}
		@Override
		public int compareTo(Pairs o)
		{
			// TODO Auto-generated method stub
			return Integer.compare(x,o.x);
		}
		@Override
		public int hashCode()
		{
			return  Objects.hash(x,y);
		}

	}

	public static void debug(Object... o) 
	{
		System.out.println(Arrays.deepToString(o));
	}

	public static boolean isPal(String s) 
	{
		for (int i = 0, j = s.length() - 1; i <= j; i++, j--)
		{
			if (s.charAt(i) != s.charAt(j))
				return false;
		}
		return true;
	}

	public static String rev(String s)
	{
		StringBuilder sb = new StringBuilder(s);
		sb.reverse();
		return sb.toString();
	}

	public static long gcd(long x, long y)
	{
		if (y == 0)
			return x;
		if (x % y == 0)
			return y;
		else
			return gcd(y, x % y);
	}

	public static int gcd(int x, int y)
	{
		if(y==0)
			return x;
		if (x % y == 0)
			return y;
		else
			return gcd(y, x % y);
	}

	public static long gcdExtended(long a, long b, long[] x) 
	{

		if (a == 0) 
		{
			x[0] = 0;
			x[1] = 1;
			return b;
		}
		long[] y = new long[2];
		long gcd = gcdExtended(b % a, a, y);

		x[0] = y[1] - (b / a) * y[0];
		x[1] = y[0];

		return gcd;
	}

	
	

	public static long max(long a, long b) 
	{
		if (a > b)
			return a;
		else
			return b;
	}

	public static long min(long a, long b)
	{
		if (a > b)
			return b;
		else
			return a;
	}

	public static long[][] mul(long a[][], long b[][])
	{
		long c[][] = new long[2][2];
		c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
		c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1];
		c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0];
		c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1];

		return c;
	}

	public static long[][] pow(long n[][], long p, long m)
	{
		long result[][] = new long[2][2];
		result[0][0] = 1;
		result[0][1] = 0;
		result[1][0] = 0;
		result[1][1] = 1;

		if (p == 0)
			return result;
		if (p == 1)
			return n;
		while (p != 0)
		{
			if (p % 2 == 1)
				result = mul(result, n);
			//System.out.println(result[0][0]);
			for (int i = 0; i < 2; i++)
			{
				for (int j = 0; j < 2; j++)
				{
					if (result[i][j] >= m)
						result[i][j] %= m;
				}
			}

			p >>= 1;
			n = mul(n, n);
			// System.out.println(1+" "+n[0][0]+" "+n[0][1]+" "+n[1][0]+" "+n[1][1]);
			for (int i = 0; i < 2; i++) 
			{
				for (int j = 0; j < 2; j++)
				{
					if (n[i][j] >= m)
						n[i][j] %= m;
				}
			}
		}
		return result;
	}
	public static long pow(long n,long p, long m)
	{
		long result=1;
		if(p==0)return 1;
		if(p==1)return n%m;
		while(p!=0)
		{
			if(p%2==1)result=(result*n)%m;
			p >>=1;
			n=(n*n)%m;
		}
		return result;
	}
	public static long pow(long n, long p) 
	{
		long result = 1;
		if (p == 0)
			return 1;
		if (p == 1)
			return n;
		while (p != 0)
		{
			if (p % 2 == 1)
				result *= n;
			p >>= 1;
			n *= n;
		}
		return result;
	}

	static class InputReader {

		private final InputStream stream;
		private final byte[] buf = new byte[8192];
		private int curChar, snumChars;
		private SpaceCharFilter filter;

		public InputReader(InputStream stream)
		{
			this.stream = stream;
		}

		public int snext()
		{
			if (snumChars == -1)
				throw new InputMismatchException();
			if (curChar >= snumChars)
			{
				curChar = 0;
				try 
				{
					snumChars = stream.read(buf);
				}
				catch (IOException e)
				{
					throw new InputMismatchException();
				}
				if (snumChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}

		public int nextInt()
		{
			int c = snext();
			while (isSpaceChar(c))
			{
				c = snext();
			}
			int sgn = 1;
			if (c == '-')
			{
				sgn = -1;
				c = snext();
			}
			int res = 0;
			do
			{
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			}
			while (!isSpaceChar(c));
			return res * sgn;
		}

		public long nextLong()
		{
			int c = snext();
			while (isSpaceChar(c))
			{
				c = snext();
			}
			int sgn = 1;
			if (c == '-') 
			{
				sgn = -1;
				c = snext();
			}
			long res = 0;
			do 
			{
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			}
			while (!isSpaceChar(c));
			return res * sgn;
		}

		public int[] nextIntArray(int n)
		{
			int a[] = new int[n];
			for (int i = 0; i < n; i++)
			{
				a[i] = nextInt();
			}
			return a;
		}

		public long[] nextLongArray(int n)
		{
			long a[] = new long[n];
			for (int i = 0; i < n; i++) 
			{
				a[i] = nextInt();
			}
			return a;
		}

		public String readString()
		{
			int c = snext();
			while (isSpaceChar(c))
			{
				c = snext();
			}
			StringBuilder res = new StringBuilder();
			do 
			{
				res.appendCodePoint(c);
				c = snext();
			} 
			while (!isSpaceChar(c));
			return res.toString();
		}

		public String nextLine()
		{
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			StringBuilder res = new StringBuilder();
			do
			{
				res.appendCodePoint(c);
				c = snext();
			}
			while (!isEndOfLine(c));
			return res.toString();
		}

		public boolean isSpaceChar(int c) 
		{
			if (filter != null)
				return filter.isSpaceChar(c);
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}

		private boolean isEndOfLine(int c)
		{
			return c == '\n' || c == '\r' || c == -1;
		}

		public interface SpaceCharFilter 
		{
			public boolean isSpaceChar(int ch);
		}
	}
}