#include<bits/stdc++.h>
using namespace std;
int num,ans=INT_MAX;
struct matrix{
int b[5][5];
bool operator < (const matrix&hhh) const{
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
if(b[i][j]!=hhh.b[i][j]) return b[i][j]<hhh.b[i][j];
return b[1][1]!=hhh.b[1][1];
}
}aa;
matrix val;
int h(matrix x){
int res=0;
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
if(x.b[i][j]!=val.b[i][j])
++res;
return res;
}
map <matrix,bool> a;
struct node{
matrix y;
int h1,s;
bool operator < (const node&hhh) const{
return s+h1>hhh.s+hhh.h1;
}
};
priority_queue <node> q;
void bfs(){
q.push(node{aa,h(aa),0});
a[aa]=true;
while(!q.empty()){
node w=q.top();q.pop();
matrix k=w.y;
if(h(k)==0){
ans=min(ans,w.s);
break;
}
for(int i=1;i<=3;++i){
for(int j=1;j<=3;++j){
if(k.b[i][j]==0){
if(i!=1){
swap(k.b[i-1][j],k.b[i][j]);
if(!a[k]){
q.push((node){k,h(k),w.s+1});a[k]=true;
}
swap(k.b[i-1][j],k.b[i][j]);
}
if(i!=3){
swap(k.b[i+1][j],k.b[i][j]);
if(!a[k]){
q.push((node){k,h(k),w.s+1});a[k]=true;
}
swap(k.b[i+1][j],k.b[i][j]);
}
if(j!=3){
swap(k.b[i][j+1],k.b[i][j]);
if(!a[k]){
q.push((node){k,h(k),w.s+1});a[k]=true;
}
swap(k.b[i][j+1],k.b[i][j]);
}
if(j!=1){
swap(k.b[i][j-1],k.b[i][j]);
if(!a[k]){
q.push((node){k,h(k),w.s+1});a[k]=true;
}
swap(k.b[i][j-1],k.b[i][j]);
}
}
}
}
}
}
int main(){
cin>>num;
for(int i=3;i;--i)
for(int j=3;j;--j){
aa.b[i][j]=num%10;
num/=10;
}
val.b[1][1]=1,val.b[1][2]=2,val.b[1][3]=3,val.b[2][1]=8,val.b[2][2]=0,val.b[2][3]=4,val.b[3][1]=7,val.b[3][2]=6,val.b[3][3]=5;
bfs();
cout<<ans;
return 0;
}