#include<bits/stdc++.h>
using namespace std;
int n=3,dy[4]={0,0,1,-1},dx[4]={1,-1,0,0},nx,ny;//这里的dx,dy是对的
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//这样写97
char ch;
struct M{
int a[5][5];
bool operator<(const M &x)const{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)if(a[i][j]!=x.a[i][j])return a[i][j]<x.a[i][j];
return 0;
}
} to,sum;
int h(M x){
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)res+=(x.a[i][j]!=to.a[i][j]);
return res;
}
struct node{
M x;
int t;
bool operator<(const node &y)const{
return t+h(x)>y.t+h(y.x);
}
}now;
priority_queue<node>q;
set<M>s;
int main(){
to.a[1][1]=1,to.a[1][2]=2,to.a[1][3]=3,to.a[2][1]=8,to.a[2][2]=0,to.a[2][3]=4,to.a[3][1]=7,to.a[3][2]=6,to.a[3][3]=5;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>ch;
sum.a[i][j]=ch-'0';
}
q.push((node){
sum,0
});
while(!q.empty()){
now=q.top();
q.pop();
if(!h(now.x)){
cout<<now.t<<endl;
//continue;
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)if(!now.x.a[i][j])nx=i,ny=j;
for(int i=0;i<4;i++){
int Nx=nx+dx[i],Ny=ny+dy[i];
if(Nx>=1&&Ny>=1&&Nx<=3&&Ny<=3){
swap(now.x.a[nx][ny],now.x.a[Nx][Ny]);
if(!s.count(now.x)){
q.push((node){
now.x,now.t+1
});
s.insert(now.x);
}
swap(now.x.a[nx][ny],now.x.a[Nx][Ny]);
}
}
}
}