#include <bits/stdc++.h>
using namespace std;
string r="123804765";
struct node{
string s;
int step,pos;
bool operator()(node a,node b){
int sa=0,sb=0;
for(int i=0;i<9;i++){
if(a.s[i]!=r[i]) sa++;
if(b.s[i]!=r[i]) sb++;
}
return a.step+sa>b.step+sb;
}
}x,y;
map<string,bool> m;
void dfs(node x){
if(x.s==r) {cout<<x.step;return;}
priority_queue<node,vector<node>,node> q;
m[x.s]=1;
q.push(x);
int f[4]={-3,1,3,-1};
while(!q.empty()){
x=y=q.top();
q.pop();
for(int i=0;i<4;i++){
if(x.pos+f[i]<0||x.pos+f[i]>8)continue;
if(x.pos%3==2&&i==1)continue;
if(x.pos%3==0&&i==3)continue;
swap(x.s[x.pos],x.s[x.pos+f[i]]);
if(!m[x.s]){
if(x.s==r){
cout<<x.step+1;
return;
}
x.pos=x.pos+f[i];
m[x.s]=1;
x.step++;
q.push(x);
}
x=y;
}
}
return;
}
int main(){
cin>>x.s;
x.step=0;
x.pos=x.s.find('0');
dfs(x);
return 0;
}