#include<cmath>
const int fx[4]={0,0,1,-1};//右左上下
const int fy[4]={1,-1,0,0};
const int calc[9]={1,7,49,343,2401,16807,117649,823543,5764801};
struct node{int x,y,d,a[3][3];} f[400000];
int map[3][3]={{1,2,3},{8,0,4},{7,6,5}};
bool bz[70000000];
int head=1,tail=1,ans=0;
char st[10];
int main()
{
int u=0,s=0;
scanf("%s",st);
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
{
f[1].a[i][j]=st[u]-48;
if(f[1].a[i][j]==0)
{
f[1].x=i;
f[1].y=j;
}
s+=f[1].a[i][j]*calc[u];
ans+=map[i][j]*calc[u++];
}
bz[s]=false;
f[1].d=0;
while(head<=tail)
{
for(int i=0;i<=3;i++)
{
int t1=f[head].x+fx[i],t2=f[head].y+fy[i];
if(t1<0||t1>2||t2<0||t2>2) continue;
tail++;
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
f[tail].a[j][k]=f[head].a[j][k];
int t=f[tail].a[t1][t2];
f[tail].a[t1][t2]=0;
f[tail].a[f[head].x][f[head].y]=t;
f[tail].x=t1;
f[tail].y=t2;
f[tail].d=f[head].d+1;
int u=0,s=0;
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
s+=f[tail].a[j][k]*calc[u++];
if(!bz[s]) bz[s]=true; else tail--;
if(s==ans)
{
printf("%d",f[tail].d);
return 0;
}
}
head++;
}
}
#include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
char *viss=(char *)malloc(95341761);
const int nine[11]={1,9,81, 729,6561,59049,531441,4782969,43046721,387420489};
int h(const int ap[4][4]){
int ans=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++){
ans+=nine[ 8-(i-1)*3-(j-1) ]*ap[i][j];
}
return ans;
}
void reset(int x,int ap[4][4]){
for(int i=3;i>0;i--)
for(int j=3;j>0;j--){
ap[i][j]=x%9;
x/=9;
}
}
#define pass(ha) (viss[(ha>>3)]|=(1<<(ha%8)));
#define meet(ha) ((bool)(viss[(ha>>3)]&(1<<(ha%8))))
class node{
public:
int hashs,walk,x,y;
node(int a,int b,int c,int d):hashs(a),walk(b),x(c),y(d){}
};
int a[4][4],b[4][4]={{0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}},beginx,beginy;
const int next_walk[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int main(void)
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++){
char ch=getchar();
while(ch>'9'||ch<'0')
ch=getchar();
a[i][j]=ch-'0';
if(a[i][j]==0)
beginx=i,beginy=j;
}
queue<node> q;
int tmps=h(a),end_hash=h(b);
q.push(node(tmps,0,beginx,beginy));
pass(tmps);
while(!q.empty()){
node x=q.front();
if(x.hashs==end_hash){
printf("%d",x.walk);
exit(0);
}
for(int k=0;k<4;k++){
reset(x.hashs,a);
int tx=x.x+next_walk[k][0],ty=x.y+next_walk[k][1];
if(tx<1||ty<1||tx>3||ty>3)
continue;
a[x.x][x.y]=a[tx][ty];
a[tx][ty]=0;
tmps=h(a);
if(meet(tmps)==false){
q.push(node(tmps,x.walk+1,tx,ty));
pass(tmps);
}
a[tx][ty]=a[x.x][x.y];
a[x.x][x.y]=0;
}
q.pop();
}
return 0;
}