// poj 1077 Eight
/*
普通的广搜题,因为忘了标记爆了好多次空间,吸取教训!
*/
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int inf = 1<<29;
const int size = 362880;
struct node
{
int s[9],x,pre;
char move;
}Q[size+10];
int mark[size+10],obj;
int r[4][2]={0,1,1,0,0,-1,-1,0};
char ch[4]={'r','d','l','u'};
int a[9];
int fac[9];
int cantor(int a[])
{
int ans=0,hash[9]={0},p;
for (int i=0;i<9;++i)
{
p=a[i];
for (int j=0;j<a[i];++j) if (hash[j]) --p;
hash[a[i]]=1;
ans+=p*fac[8-i];
}
return ans;
}
void print(int i)
{
if ( Q[i].pre==-1) return ;
print(Q[i].pre);
printf("%c",Q[i].move);
}
void solve()
{
memset(mark,0,sizeof(mark));
int c=cantor(Q[0].s);
if (c==obj) {
printf("/n");
return ;
}
Q[0].pre=-1;
mark[c]=1;
int head=0,tail=1;
node k;
while (head<tail)
{
int xx=Q[head].x/3,yy=Q[head].x%3,v,w;
for (int i=0;i<4;i++)
{
k=Q[head];
k.pre=head;
v=xx+r[i][0],w=yy+r[i][1];
if (v>=0 && v<3 && w>=0 && w<3)
{
k.x=v*3+w;
k.s[Q[head].x]=k.s[k.x];
k.s[k.x]=0;
c=cantor(k.s);
if (mark[c]) continue;
mark[c]=1;
k.move=ch[i];
Q[tail++]=k;
if (c==obj) break;
}
}
if (c==obj) break;
head++;
}
if (head<tail) print(tail-1);
else printf("unsolvable");
printf("/n");
}
int main()
{
fac[0]=1;
for (int i=1;i<=8;i++) fac[i]=i*fac[i-1];
for (int i=0;i<8;i++) Q[0].s[i]=i+1;
Q[0].s[8]=0;
obj=cantor(Q[0].s);
char ch[2];
while (scanf("%s",ch)!=EOF)
{
if (ch[0]=='x') { Q[0].s[0]=0;Q[0].x=0;}
else Q[0].s[0]=ch[0]-'0';
for (int i=1;i<9;i++) {
scanf("%s",ch);
if (ch[0]=='x') { Q[0].s[i]=0;Q[0].x=i;}
else Q[0].s[i]=ch[0]-'0';
}
solve();
}
system("pause");
return 0;
}