/*终于用A*做出了这道经典八数码*/
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
using namespace std;
struct point{
char board[10];
int space;
};
int f[400000],d[400000];
int colour[400000],parent[400000],moves[400000],path[400000];
int fac[10]={ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };
int xx[4]={1,-1,0,0};
int yy[4]={0,0,1,-1};
struct cmp{
bool operator()(const int u,const int v){
return f[u]>f[v];
}
};
int calhash(char * tmp){
int i,j;
int temp=0,sum=0;
for(i=0;i<9;i++){
temp=0;
for(j=i+1;j<9;j++){
if(tmp[i]>tmp[j])
temp++;
}
sum+=temp*fac[9-i-1];
}
return sum;
}
int h(struct point & temp){
int i,j,k,sum=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++){
k=i*3+j;
if(temp.board[k]!='9'){
sum+=abs(i-(temp.board[k]-'1')/3)+abs(j-(temp.board[k]-'1')%3);
}
}
return sum;
}
void get_node(int per,struct point & cur){
int i,j=0,k,temp,flag[10];
memset(flag,0,sizeof(flag));
for(i=8;i>=0;i--){
temp=0;
cur.board[j]=per/fac[i];
for(k=1;k<10;k++){
if(temp==cur.board[j] && flag[k]==0)
break;
if(flag[k]==0)
temp++;
}
flag[k]=1;
cur.board[j]=k+'0';
if(cur.board[j]=='9'){
cur.space=j;
}
j++;
per%=fac[i];
}
}
int Astar(struct point & sta){
int u,v,k,x,y,i,xxx,yyy,z;
priority_queue<int,vector<int>,cmp> que;
struct point cur,temp;
moves[0]=-1;
u=calhash(sta.board);
f[u]=h(sta);
d[u]=0;
que.push(u);
colour[u]=1;
parent[u]=-1;
while(!que.empty()){
int tem;
tem=que.top();
if(tem==0)
return 1;
que.pop();
get_node(tem,cur);
k=cur.space;
x=k/3;
y=k%3;
for(i=0;i<4;i++){
xxx=x+xx[i];
yyy=y+yy[i];
if(xxx<0 || xxx>2 || yyy<0 || yyy>2)
continue;
temp.space=3*xxx+yyy;
temp.board[temp.space]='9';
temp.board[cur.space]=cur.board[temp.space];
for(z=0;z<9;z++){
if(z!= temp.space && z!=cur.space)
temp.board[z]=cur.board[z];
}
v=calhash(temp.board);
if(colour[v]==1 && (d[tem]+1<d[v])){
moves[v]=i;
parent[v]=tem;
f[v]=f[v]-d[v]+d[tem]+1;
d[v]=d[tem]+1;
}
else if(colour[v]==2 && (d[tem]+1<d[v])){
moves[v]=i;
parent[v]=tem;
f[v]=f[v]-d[v]+d[tem]+1;
d[v]=d[tem]+1;
colour[v]=1;
que.push(v);
}
else if(colour[v]==0){
moves[v]=i;
parent[v]=tem;
d[v]=d[tem]+1;
f[v]=d[v]+h(temp);
que.push(v);
colour[v]=1;
}
}
colour[tem]=2;
}
return 0;
}
void printpath(){
int i,t;
if(moves[0]==-1){
printf("\n");
return;
}
t=0;
i=0;
while(parent[t]!=-1){
path[i++]=moves[t];
t=parent[t];
}
--i;
for(;i>=0;i--){
if(path[i]==0)
printf("d");
else if(path[i]==1)
printf("u");
else if(path[i]==2)
printf("r");
else
printf("l");
}
printf("\n");
}
int main(){
int i,j,k;
char input[30];
gets(input);
i=0;j=0;
struct point sta;
while(input[i]!='\0'){
if(input[i]==' ')
;
else if(input[i]=='x'){
sta.board[j++]='9';
sta.space=j-1;
}
else
sta.board[j++]=input[i];
i++;
}
if(Astar(sta)){
printpath();
}
else
printf("unsolvable\n");
}