#include <bits/stdc++.h>
#define R register
#define ll long long
#define F(i,a,b) for(int i = (a);i<=(b);i++)
using namespace std;
inline int read(){R int x=0,t=1;R char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*t;}
struct Node
{
int a[4][4];
}m[1001],ans[1001];
map<Node,int>mp;
int minn;
inline bool check(int i)
{
return (m[i].a[1][1]==0 && m[i].a[1][2]==1 &&m[i].a[1][3]==2 &&m[i].a[2][1]==3 &&m[i].a[2][2]==4 &&m[i].a[2][3]==5 &&m[i].a[3][1]==6 &&m[i].a[3][2]==7 && m[i].a[3][3]==8);
}
void dfs(int i)
{
if(minn<=i) return;
m[i]=m[i-1];
swap(m[i].a[2][1],m[i].a[2][2]);
swap(m[i].a[2][2],m[i].a[2][3]);
if(check(i) && minn>i){
minn=i;
for(int j = 1;j<=i;j++) ans[j]=m[j];
}
if(mp[m[i]]==0) mp[m[i]]=i;
else
{
if(mp[m[i]]>i) {
mp[m[i]]=i;
dfs(i+1);
}
}
m[i]=m[i-1];
m[i].a[1][1]=m[i-1].a[2][1],m[i].a[1][2]=m[i-1].a[1][1],m[i].a[1][3]=m[i-1].a[1][2];
m[i].a[2][1]=m[i-1].a[3][1],m[i].a[2][3]=m[i-1].a[1][3];
m[i].a[3][1]=m[i-1].a[3][2],m[i].a[3][2]=m[i-1].a[3][3],m[i].a[3][3]=m[i-1].a[2][3];
if(check(i) && minn>i){
minn=i;
for(int j = 1;j<=i;j++) ans[j]=m[j];
}
if(mp[m[i]]==0) mp[m[i]]=i;
else
{
if(mp[m[i]]>i) {
mp[m[i]]=i;
dfs(i+1);
}
}
m[i]=m[i-1];
return;
}
inline void solve()
{
m[0].a[1][1]=0,m[0].a[1][2]=1,m[0].a[1][3]=2;
m[0].a[2][1]=3,m[0].a[2][2]=4,m[0].a[2][3]=5;
m[0].a[3][1]=6,m[0].a[3][2]=7,m[0].a[3][3]=8;
for(int i = 1;i<=3;i++)
{
for(int j = 1;j<=3;j++)
{
cin >> m[1].a[i][j];
}
}
dfs(2);
cout << minn-1;
return;
}
int main()
{
solve();
return 0;
}