#include
#include
int fac[10]={1,1};
int hash[362880];
struct Node
{
int s[9],step,pos;
int hashval()
{
int ret=0,i,j,tmp;
int flag[9];
memset(flag,0,sizeof(flag));
for(i=0;i<8;i++)
{
tmp=0;
for(j=0;j if(!flag[j])
tmp++;
ret+=tmp*fac[8-i];
flag[s[i]]=1;
}
return ret;
}
int up()
{
if(pos<=2)return 0;
s[pos]^=s[pos-3];
s[pos-3]^=s[pos];
s[pos]^=s[pos-3];
pos-=3;
return 1;
}
int down()
{
if(pos>=6)return 0;
s[pos]^=s[pos+3];
s[pos+3]^=s[pos];
s[pos]^=s[pos+3];
pos+=3;
return 1;
}
int left()
{
if(pos==0||pos==3||pos==6)return 0;
s[pos]^=s[pos-1];
s[pos-1]^=s[pos];
s[pos]^=s[pos-1];
pos--;
return 1;
}
int right()
{
if(pos==2||pos==5||pos==8)return 0;
s[pos]^=s[pos+1];
s[pos+1]^=s[pos];
s[pos]^=s[pos+1];
pos++;
return 1;
}
int EQ(const Node&x)
{
int i;
for(i=0;i<9;i++)if(s[i]!=x.s[i])return 0;
return 1;
}
}Q[362880],S,A,B,tmp,top;
void mkfac(){int i;for(i=2;i<=9;i++)fac[i]=fac[i-1]*i;}
int main()
{
char buf[101];
int i,t,l,r;
int flag;
mkfac();
while(scanf("%d",&A.s[0])!=EOF)
{
t=0;
if(A.s[0]==0)A.pos=0;
for(i=1;i<=8;i++){scanf("%d",&A.s[i]);if(A.s[i]==0)A.pos=i;}
for(i=0;i<=8;++i)
{
scanf("%d",&B.s[i]);
if(B.s[i]==0)B.pos=i;
}
l=r=0;
flag=0;
memset(hash,0,sizeof(hash));
S=A;
S.step=0;
Q[r++]=S;
while(l<=r)
{
top=Q[l++];
top.step++;
//up...
tmp=top;
if(tmp.up())
{
if(!hash[t=tmp.hashval()])
{
if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
hash[t]=1;
Q[r++]=tmp;
}
}
//down...
tmp=top;
if(tmp.down())
{
if(!hash[t=tmp.hashval()])
{
if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
hash[t]=1;
Q[r++]=tmp;
}
}
//left...
tmp=top;
if(tmp.left())
{
if(!hash[t=tmp.hashval()])
{
if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
hash[t]=1;
Q[r++]=tmp;
}
}
//right...
tmp=top;
if(tmp.right())
{
if(!hash[t=tmp.hashval()])
{
if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
hash[t]=1;
Q[r++]=tmp;
}
}
}
AA:;
if(!flag)
puts("-1");
}
return 0;
}