#include <iostream>
#include <cstring>
#include <algorithm>
#include<unordered_map>
#include<queue>
using namespace std;
const int N=10;
int dx[]={-1,1,0,0};//上下左右
int dy[]={0,0,-1,1};
string g,seq;
char n;
string endd="12345678x";
int f(string state)
{
int dist=0;
for(int i=0;i<9;i++)
{
if(state[i]!='x')
{
int t=state[i]-'1';
dist+=abs(t/3-i/3)+abs(t%3-i%3);
}
}
return dist;
}
string bfs(string start)
{
priority_queue<pair<int, string>, vector<pair<int, string>>, greater<pair<int, string>>>heap;//优先队列,存到终点的距离
unordered_map<string,int>dist;//起点到此状态的距离
unordered_map<string,pair<string,char>>pre;//存储此状态的上一个状态
char op[]="udlr";
heap.push({f(start),start});
dist[start]=0;
while(heap.size())
{
auto t=heap.top();
heap.pop();
if(t.second==endd)break;
int x,y;
for(int i=0;i<9;i++)
if(t.second[i]=='x')
{
x=i/3,y=i%3;
break;
}
string state=t.second;
string source=state;
for(int i=0;i<4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx<0||nx>=3||ny<0||ny>=3)continue;
swap(state[nx*3+ny],state[x*3+y]);
if(!dist.count(state)||dist[state]>dist[source]+1)
{
dist[state]=dist[source]+1;
pre[state]={source,op[i]};
heap.push({dist[state]+f(state),state});
}
swap(state[nx*3+ny],state[x*3+y]);
}
}
string res;
while(endd!=start)
{
res+=pre[endd].second;
endd=pre[endd].first;
}
reverse(res.begin(),res.end());
return res;
}
int main()
{
while(cin>>n)
{
g+=n;
if(n!='x')seq+=n;
}
int t = 0;
for (int i=0; i<8;i++ )
for (int j=i+1; j<8;j++)
if (seq[i]>seq[j])
t++ ;
if(t%2)cout<<"unsolvable"<<endl;//A*算法必须保证答案有解
else cout<<bfs(g)<<endl;
return 0;
}