Given are two sequences a=\\{a_0,\ldots,a_{N-1}\\} and b=\\{b_0,\ldots,b_{N-1}\\} of N non-negative integers each.

Snuke will choose an integer k such that 0 \leq k < N and an integer x not less than 0, to make a new sequence of length N, a'=\\{a_0',\ldots,a_{N-1}'\\}, as follows:

* a_i'= a_{i+k \mod N}\ XOR \ x



Find all pairs (k,x) such that a' will be equal to b.

What is \mbox{ XOR }?

The XOR of integers A and B, A \mbox{ XOR } B, is defined as follows:

* When A \mbox{ XOR } B is written in base two, the digit in the 2^k's place (k \geq 0) is 1 if either A or B, but not both, has 1 in the 2^k's place, and 0 otherwise.

For example, 3 \mbox{ XOR } 5 = 6. (In base two: 011 \mbox{ XOR } 101 = 110.)

Constraints

* 1 \leq N \leq 2 \times 10^5
* 0 \leq a_i,b_i < 2^{30}
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N
a_0 a_1 ... a_{N-1}
b_0 b_1 ... b_{N-1}


Output

Print all pairs (k, x) such that a' and b will be equal, using one line for each pair, in ascending order of k (ascending order of x for pairs with the same k).

If there are no such pairs, the output should be empty.

Examples

Input

3
0 2 1
1 2 3


Output

1 3


Input

5
0 0 0 0 0
2 2 2 2 2


Output

0 2
1 2
2 2
3 2
4 2


Input

6
0 1 3 7 6 4
1 5 4 6 2 3


Output

2 2
5 5


Input

2
1 2
0 0


Output
#include<bits/stdc++.h>
#define pi 3.1415926535897932384626
using namespace std;
      
struct P{
  int x,y;
  bool operator < (const P &a )const{
    //if(y!=a.y)
    return y>a.y;
  };
};

int a,b,c,d,i,k,n,m,e,dx[10]={1,0,-1,0,1,1,-1,-1},dy[10]={0,1,0,-1,1,-1,1,-1};
int o[400031],o1[400101];
int l[400055],l1[400101];
int j[400101];

long long x,y,z,mod=1000000007;
//string r;
char r[1];

P u[1];
queue<int> q;

//stack<int> s;
set<int> s;
map<int,int> p;
vector<P> v;

bool as(P a,P b)
{
  if(a.x==b.x)
  return a.y<b.y;
  return a.x<b.x;
}


int main()
{
  scanf("%d",&a);
  for(int t=0;t<a;t++)
    scanf("%d",&o1[t]);
   
  for(int t=0;t<a;t++)
    scanf("%d",&l1[t]);
  
  for(int t=1;t<2*a;t++)
  {
    o[t]=(o1[(t-1)%a]^o1[t%a]);
    //printf("%d ",o[t]);
  }
  //puts("#");
  for(int t=1;t<a;t++)
  {
    l[t]=(l1[t-1]^l1[t]);
    //printf("%d ",l[t]);
  }
  for(int t=2;t<a;t++)
  {
    for(;k&&l[k+1]!=l[t];k=j[k]);
    if(l[k+1]==l[t]) k++,j[t]=k;
  }
  k=0;
  for(int t=1;t<2*a-1;t++)
  {
    for(;k&&l[k+1]!=o[t];k=j[k]);
    if(l[k+1]==o[t]) k++;
    //printf("@@%d %d %d %d\n",t,k,l[k],o[t]);
    if(k==a-1)
    {
      k=j[k];
      v.push_back({(t-a+1),o1[(t+t-a+1)%a]^l1[(t)%a]});
    }
  }
  sort(v.begin(),v.end(),as);
  //puts("#");
  for(int t=0;t<v.size();t++)
  printf("%d %d\n",v[t].x,v[t].y);
}

