#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define value first
#define index second
#define EGRY \
ios_base::sync_with_stdio(false); \
cin.tie(NULL);
const int MAX = 2 * 1e5 + 1000;
const int MOD = 1e9 + 7;
const int OO = INT_MAX;
const double EPS = (double)1e-9;
bitset<1000000000> visited;
vector<vector<int>> matrix(3, vector<int>(3));
int target = 123456789;
ll encode(vector<vector<int>> &matrix)
{
ll num = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
num = num * 10 + matrix[i][j];
}
}
return num;
}
ll bfs()
{
queue<vector<vector<int>>> q;
q.push(matrix);
ll level = 0, size = 1;
visited.set(encode(matrix));
while (!q.empty())
{
while (size--)
{
vector<vector<int>> cur_matrix = q.front();
q.pop();
if (encode(cur_matrix) == target)
{
return level;
}
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
swap(cur_matrix[i][j], cur_matrix[i + 1][j]);
int state = encode(cur_matrix);
if (!visited.test(state))
{
visited.set(state);
q.push(cur_matrix);
}
swap(cur_matrix[i][j], cur_matrix[i + 1][j]);
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
swap(cur_matrix[i][j], cur_matrix[i][j + 1]);
int state = encode(cur_matrix);
if (!visited.test(state))
{
visited.set(state);
q.push(cur_matrix);
}
swap(cur_matrix[i][j], cur_matrix[i][j + 1]);
}
}
}
size = (ll)q.size(), level++;
}
return -1;
}
void solve()
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cin >> matrix[i][j];
}
}
cout << bfs();
}
int main()
{
EGRY
ll t = 1;
// cin >> t;
while (t--)
{
solve();
}
return 0;
}