#include <iostream>
#include <cstdio>
#define in "biperm.in","r",stdin
#define out "biperm.out","w",stdout
#include <vector>
#define nmax 10009
using namespace std;
int n,A[3][nmax],viz[nmax],nr,vi[nmax],vf[nmax],nri,nrf,nrt;
vector<int>G[nmax],d[nmax],aux[nmax],aux1[nmax],ad[nmax],ag[nmax],add[nmax],S[nmax],w;
void Going(int k,int q){
int x,y,i,j;
x = G[k][q];
if(d[x][0]==k&&d[x].size()==2)
d[x][0]=d[x][1];
d[x].pop_back();
nri=0;
cout << k <<' '<<x<<' ';
viz[k]=viz[x]=1;
while(x!=k){
if(!G[x].size()){
nri++;
y=x;
x=d[x][0];
if(G[x][0]==y&&G[x].size()==2)
G[x][0]=G[x][1];
G[x].pop_back();
}
else{ y=x;
x = G[x][0];
if(d[x][0]==y&&d[x].size()==2)
d[x][0]=d[x][1];
d[x].pop_back();
}
cout << x <<' ';
viz[x]=1;
}
cout << nri<<'\n';
// nr+=nri;
}
void Going2(int k,int q){
int x,y,i,j;
x = ag[k][q];
if(d[x][0]==k&&ad[x].size()==2)
ad[x][0]=ad[x][1];
ad[x].pop_back();
nrf=0;
cout << k <<' '<<x<<' ';
vi[k]=vi[x]=1;
while(x!=k){
if(!ag[x].size()){
nrf++;
y=x;
x=ad[x][0];
if(ag[x][0]==y&&ag[x].size()==2)
ag[x][0]=ag[x][1];
ag[x].pop_back();
}
else{ y=x;
x = ag[x][0];
if(ad[x][0]==y&&ad[x].size()==2)
ad[x][0]=ad[x][1];
ad[x].pop_back();
}
vi[x]=1;
cout << x <<' ';
}
cout<<'\n';
}
void Going3(int k,int q){
int x,y,i,j;
x = G[k][q];
if(d[x][0]==k&&d[x].size()==2)
d[x][0]=d[x][1];
d[x].pop_back();
nri=0;
// cout << k <<' '<<x<<' ';
vf[k]=vf[x]=1;
while(x!=k){
if(!G[x].size()){
nri++;
y=x;
x=d[x][0];
if(G[x][0]==y&&G[x].size()==2)
G[x][0]=G[x][1];
G[x].pop_back();
}
else{ y=x;
x = G[x][0];
if(d[x][0]==y&&d[x].size()==2)
d[x][0]=d[x][1];
d[x].pop_back();
}
// cout << x <<' ';
vf[x]=1;
}
// cout << nri<<'\n';
}
int main(){
int i,j,x,ii,p,y;
freopen(in);
freopen(out);
scanf("%d",&n);
for(i=1;i<=2;i++)
for(j=1;j<=n;j++)
scanf("%d",&A[i][j]);
for(i=1;i<=n;i++){
G[A[1][i]].push_back(A[2][i]);
d[A[2][i]].push_back(A[1][i]);
ag[A[1][i]].push_back(A[2][i]);
ad[A[2][i]].push_back(A[1][i]);
}
p=0;
for(i=1;i<=n;i++){
if(!viz[A[1][i]]){
if(G[A[1][i]].size()==1){
Going(A[1][i],0);
nrt+=nri;
p++;
}
else if(G[A[1][i]].size()==2){
p++;
Going2(A[1][i],0);
Going3(A[1][i],1);
if(nri>=nrf){
for(j=1;j<=n;j++)
if(vf[A[1][j]])
viz[A[1][j]] = vf[A[1][j]];
}
else
for(j=1;j<=n;j++)
if(vi[A[1][j]])
viz[A[1][j]]=vi[A[1][j]];
nrt=nrt+min(nri,nrf);
}
}
}
// cout << G[18][1]<<' ';
// Going(1,0);
// Going(5,0);
// Going(2,0);
// Going(3,0);
int sol;
sol=1;
for(i=1;i<=p;i++)
sol*=2;
cout <<sol<<' '<<nrt<<'\n';
cout<<'\n';
// for(i=1;i<=n;i++)
// {
// cout << A[1][i]<<' ';
// if(G[A[1][i]].size())
// cout << G[A[1][i]][0]<<' ';
// if(d[A[1][i]].size())
// cout<<d[A[1][i]][0]<<' ';
// cout << '\n';
// }
return 0;
}