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

// Created by @thesupremeone on 12/07/21
public class ShortProgram {
    char[] arr;
    char[] getArr(int n){
        String str = Integer.toBinaryString(n);
        char[] arr = new char[10];
        int i=str.length()-1, j=arr.length-1;
        while (j>=0){
            if(i>=0){
                arr[j]=str.charAt(i);
                i--;
            }else {
                arr[j] = '0';
            }
            j--;
        }
        return arr;
    }

    char op(char op, char a, char b){
        if(op=='|'){
            if(b=='1' || a=='1')
                return '1';
        }else if(op=='&'){
            if(b=='0')
                return '0';
        }else if(op=='^'){
            if(a=='x'){
                if(b=='1') return 'y';
            }else if(a=='y'){
                if(b=='1') return 'x';
            }else if(a=='1'){
                if(b=='1') return '0';
            }else if(a=='0'){
                if(b=='1') return '1';
            }
        }
        return a;
    }

    void performOp(char op, char[] second){
        for (int i = 0; i < 10; i++) {
            arr[i] = op(op, arr[i], second[i]);
        }
    }

    int getInt(char[] arr){
        int ans = 0;
        int j = 1;
        for (int i = 0; i < arr.length; i++) {
            if(arr[arr.length-1-i]=='1'){
                ans+=j;
            }
            j<<=1;
        }
        return ans;
    }

    void solve() throws IOException {
        int n = getInt();
        arr = new char[10];
        Arrays.fill(arr, 'x');
        for (int i = 0; i < n; i++) {
            String op = getToken();
            int num = getInt();
            performOp(op.charAt(0), getArr(num));
        }
        char[] or = new char[10];
        for (int i = 0; i < 10; i++) {
            if(arr[i]=='1'){
                or[i] = '1';
            }else {
                or[i] = '0';
            }
        }
        char[] and = new char[10];
        for (int i = 0; i < 10; i++) {
            if(arr[i]=='0'){
                and[i] = '0';
            }else {
                and[i] = '1';
            }
        }
        char[] xor = new char[10];
        for (int i = 0; i < 10; i++) {
            if(arr[i]=='y'){
                xor[i] = '1';
            }else {
                xor[i] = '0';
            }
        }
        println(3);
        println("| "+getInt(or));
        println("& "+getInt(and));
        println("^ "+getInt(xor));
    }

    public static void main(String[] args) throws Exception {
        if (isOnlineJudge()) {
            in = new BufferedReader(new InputStreamReader(System.in));
            out = new BufferedWriter(new OutputStreamWriter(System.out));
            new ShortProgram().solve();
            out.flush();
        } else {
            localJudge = new Thread();
            in = new BufferedReader(new FileReader("input.txt"));
            out = new BufferedWriter(new FileWriter("output.txt"));
            localJudge.start();
            new ShortProgram().solve();
            out.flush();
            localJudge.suspend();
        }
    }

    static boolean isOnlineJudge() {
        try {
            return System.getProperty("ONLINE_JUDGE") != null
                    || System.getProperty("LOCAL") == null;
        } catch (Exception e) {
            return true;
        }
    }

    // Fast Input & Output
    static Thread localJudge = null;
    static BufferedReader in;
    static StringTokenizer st;
    static BufferedWriter out;

    static String getLine() throws IOException {
        return in.readLine();
    }

    static String getToken() throws IOException {
        if (st == null || !st.hasMoreTokens())
            st = new StringTokenizer(getLine());
        return st.nextToken();
    }

    static int getInt() throws IOException {
        return Integer.parseInt(getToken());
    }

    static long getLong() throws IOException {
        return Long.parseLong(getToken());
    }

    static void print(Object s) throws IOException {
        out.write(String.valueOf(s));
    }

    static void println(Object s) throws IOException {
        out.write(String.valueOf(s));
        out.newLine();
    }
}