#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int gx[]={1,0,0,0,1,2,2,2,1};
int gy[]={1,0,1,2,2,2,1,0,0};
string goal="123804765";
struct node
{
int count;
string now;
bool operator < (const node &a)const
{
return this->count<a.count;
}
};
string fir;
priority_queue<node> q;
int f(string x)
{
int a=0;
for(int i=0;i<9;i++)
{
a=a+abs(gx[i]-x[i]/3)+abs(gy[i]-x[i]%3);
}
return a;
}
int main()
{
cin>>fir;
map<string,int> g;
g[fir]=0;
q.push((node){0,fir});
while(q.empty()==0)
{
node tp=q.top();
q.pop();
if(goal==tp.now)
{
cout<<tp.count<<"?";
break;
}
int n;
for(int i=0;i<9;i++)
{
if(tp.now[i]=='0')
{
n=i;
break;
}
}
int x=n/3,y=n%3;
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<0||ny<0||nx>=3||ny>=3)continue;
string ne=tp.now;
swap(ne[n],ne[nx*3+ny]);
g[ne]=g[tp.now]+1;
q.push((node){g[ne]+f(ne),ne});
}
}
return 0;
}