
#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
struct position
{
int a,b,c,d,e,f,g,h,i;
long long step;
inline void operator = (position x)
{
a=x.a,b=x.b,c=x.c,d=x.d,e=x.e,f=x.f,g=x.g,h=x.h,i=x.i;
}
}f;
bool vis[400000];
queue<position>q;
int ans;
inline void swap(int &a,int &b)
{
a=a+b;
b=a-b;
a=a-b;
}
inline int jc(int n)
{
int num=1;
for(int i=2;i<=n;i++)num*=i;
return num;
}
inline void move1(position &f)
{
int tmp=f.a;
f.a=f.d,f.d=f.g,f.g=f.h;
f.h=f.i,f.i=f.f,f.f=f.c,f.c=f.b,f.b=tmp;
}
inline void move2(position &f)
{
int tmp=f.b;
f.b=f.c,f.c=f.f,f.f=f.i;
f.i=f.h,f.h=f.g,f.g=f.d,f.d=f.a,f.a=tmp;
}
inline void move3(position &f)
{
swap(f.a,f.d),swap(f.d,f.g);
swap(f.b,f.e),swap(f.e,f.h);
swap(f.c,f.f),swap(f.f,f.i);
}
inline int ktzk(position f)
{
int a[15],num=0;
bool v[15];
for(int i=0;i<=10;i++)a[i]=v[i]=0;
a[0]=f.a,a[1]=f.b,a[2]=f.c,a[3]=f.d,a[4]=f.e,a[5]=f.f,a[6]=f.g,a[7]=f.h,a[8]=f.i;
for(int j=0;j<9;++j)
{
int x=a[j];
int s=0;
for(int i=0;i<x;i++)if(v[i]==0)s++;
v[x]=1;
num+=s*jc(9-j-1);
}
return num;
}
int main()
{
scanf("%1d%1d%1d%1d%1d%1d%1d%1d%1d",&f.a,&f.b,&f.c,&f.d,&f.e,&f.f,&f.g,&f.h,&f.i);
f.step=0;
q.push(f);
ans=46234;
while(!q.empty())
{
f=q.front();
q.pop();
int x=ktzk(f);
if(x==ans)
{
printf("%lld\n",f.step);
return 0;
}
if(vis[x]==1)continue;
vis[x]=1;
f.step++;
position s=f;
move1(s);
if(!vis[ktzk(s)])vis[ktzk(s)]=1,q.push(s);
s=f;
move2(s);
if(!vis[ktzk(s)])vis[ktzk(s)]=1,q.push(s);
s=f;
move3(s);
if(!vis[ktzk(s)])vis[ktzk(s)]=1,q.push(s);
}
printf("No answer");
return 0;
}