#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int mod=1000003;
int xx[]={1,-1,0,0};
int yy[]={0,0,1,-1};
struct node{
ll x,y;
}q[maxn];
char s[15];
int a[maxn],ans=123804765,l,r;
vector<int> g[mod];
int main(){
scanf("%s",s);
long long num=0;
int len=strlen(s);
for(int i=0;i<len;i++){
num=num*10+s[i]-'0';
}
//cout<<num<<endl;
l=r=0;
node now; now.x=num; now.y=0; q[++r]=now;
int b[10];
//cout<<1<<endl;
for(int i=8;i>=0;i--){
int nowx10=now.x/pow(10,i);
b[9-i]=(nowx10)%10;
}
/*for(int i=1;i<=9;i++) cout<<b[i]<<' ';
cout<<endl;*/
/*int curx1,cury1,curz1;
for(int i=1;i<=9;i++) if(b[i]==0){
curx1=(i-1)/3+1;
if(i%3==0){
cury1=3;
}
else cury1=i%3;
curz1=i;
}
cout<<curx1<<' '<<cury1<<' '<<curz1<<endl;*/
while(l<r){
now=q[++l];
int nowx=now.x,xx2,xx1=now.x;
//cout<<now.x<<' '<<now.y<<endl;
if(nowx==ans){
cout<<now.y<<endl;
break;
}
//cout<<2<<endl;
for(int i=8;i>=0;i--){
int nowx1=nowx/pow(10,i);
b[9-i]=(nowx1)%10;
}
//cout<<1<<endl;
int curx,cury,curz;
for(int i=1;i<=9;i++) if(b[i]==0){
curx=(i-1)/3+1;
if(i%3==0){
cury=3;
}
else cury=i%3;
curz=i;
}
for(int i=0;i<4;i++){
int fx=curx+xx[i],fy=cury+yy[i];
if(fx<1||fx>3||fy<1||fy>3) continue;
int num=(fx-1)*(3)+fy;
for(int j=1;j<=9;j++)
a[j]=b[j];
int tmp=a[num]; a[num]=0; a[curz]=tmp;
int now1=0,now2;
for(int j=1;j<=9;j++){
now1=now1*10+a[j];
}
now2=now1;
now1%=mod;
int f=true;
for(int j=0;j<g[now1].size();j++){
if(g[now1][j]==now2){
f=false; break;
}
}
if(f){
node now3; now3.x=now2; now3.y=now.y+1;
q[++r]=now3; g[now1].push_back(now2);
}
a[num]=tmp; a[curz]=0;
}
}
return 0;
}