#include <cmath>
#include <ctime>
#include <cctype>
#include <climits>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
#define INF (INT_MAX / 10)
#define clr(arr, val) memset(arr, val, sizeof(arr))
#define pb push_back
#define sz(a) ((int)(a).size())
using namespace std;
typedef set<int> si;
typedef vector<int> vi;
typedef map<int, int> mii;
typedef pair<int, int> pii;
typedef long long ll;
const double esp = 1e-5;
#define M 400000
int orilen;
int oritmp[9];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
char mm[] = "urdl";
int goal[9] = {1, 2, 3, 4, 5, 6, 7, 8, 0};
char strtmp[20];
int fac[20], vis[2][M];
int st[2][M][9];
int head[2];
int tail[2];
int fa[2][M];
char direct[2][M];
int getcode(int s[])
{
int res = 0;
for (int i = 0; i < 9; ++i) {
int cnt = 0;
for (int j = i + 1; j < 9; ++j) {
if (s[i] > s[j]) {
++cnt;
}
}
res += cnt * fac[8 - i];
}
return res;
}
// 忽略0之后,不改变排列的奇偶性
int check(int s[])
{
int num = 0;
for (int i = 0; i < 9; ++i) {
if (s[i] == 0) {
continue;
}
for (int j = i + 1; j < 9; ++j) {
if (s[j] != 0 && s[i] > s[j]) {
++num;
}
}
}
return num % 2;
}
void dbfs(void)
{
head[0] = 1;
head[1] = 1;
tail[0] = 2;
tail[1] = 2;
clr(vis, 0);
memcpy(st[0][1], oritmp, sizeof(oritmp));
memcpy(st[1][1], goal, sizeof(goal));
fa[0][1] = -1;
fa[1][1] = -1;
direct[0][1] = '*';
direct[1][1] = '*';
int code0 = getcode(st[0][1]);
int code1 = getcode(st[1][1]);
vis[0][code0] = 1;
vis[1][code1] = 1;
while (head[0] < tail[0] && head[1] < tail[1]) {
int no = 0;
if (head[0] == tail[0]) {
no = 1;
} else if (head[1] == tail[1]) {
no = 0;
} else {
if (tail[0] - head[0] < tail[1] - head[1]) {
no = 0;
} else {
no = 1;
}
}
int ono = 1 - no;
int code = getcode(st[no][head[no]]);
//printf("\n%d..%d", code, no);
for (int i = 0; i < 9; ++i) {
if (i % 3 == 0) {
//printf("\n");
}
//printf("%d ", st[no][head[no]][i]);
}
if (vis[ono][code]) {
//printf("done\n");
string ans;
int pos = head[no];
if (no) {
for (int i = 0; i < tail[0]; ++i) {
int tmp = getcode(st[0][i]);
if (tmp == code) {
pos = i;
break;
}
}
} else {
pos = head[no];
}
int p = pos;
//printf("\n%d.....\n", pos);
while (fa[0][p] != -1) {
ans += direct[0][p];
p = fa[0][p];
}
reverse(ans.begin(), ans.end());
//cout << ans << endl;
if (no == 0) {
for (int i = 0; i < tail[1]; ++i) {
int tmp = getcode(st[1][i]);
if (tmp == code) {
pos = i;
break;
}
}
} else {
pos = head[no];
}
p = pos;
//printf("%d.....%d\n", pos, head[no]);
while (fa[1][p] != -1) {
ans += direct[1][p];
p = fa[1][p];
}
printf("%s\n", ans.c_str());
return;
}
int idx = 0;
for (int i = 0; i < 9; ++i) {
if (st[no][head[no]][i] == 0) {
idx = i;
break;
}
}
int x = idx / 3;
int y = idx % 3;
for (int i = 0; i < 4; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
int nidx = nx * 3 + ny;
if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3) {
memcpy(st[no][tail[no]], st[no][head[no]], sizeof(st[no][head[no]]));
swap(st[no][tail[no]][idx], st[no][tail[no]][nidx]);
int ncode = getcode(st[no][tail[no]]);
if (!vis[no][ncode]) {
vis[no][ncode] = 1;
fa[no][tail[no]] = head[no];
direct[no][tail[no]] = mm[no ? (i + 2) % 4 : i];
++tail[no];
}
}
}
++head[no];
}
printf("unsolvable\n");
}
int main(int argc, char *argv[])
{
fac[0] = 1;
for (int i = 1; i < 20; ++i) {
fac[i] = fac[i - 1] * i;
}
while (fgets(strtmp, 20, stdin) != NULL) {
//printf("fgets\n");
int len = strlen(strtmp);
orilen = 0;
for (int i = 0; i < len; ++i) {
if (isdigit(strtmp[i])) {
oritmp[orilen++] = strtmp[i] - '0';
} else if (strtmp[i] == 'x') {
oritmp[orilen++] = 0;
}
}
for (int i = 0; i < 9; ++i) {
if (i % 3 == 0) {
//printf("\n");
}
//printf("%d ", oritmp[i]);
}
//printf("\n");
//printf("%d\n", getcode(oritmp));
if (check(oritmp)) {
printf("unsolvable\n");
continue;
}
dbfs();
}
return 0;
}
/**************************************************************
Problem: 2352
User: admin
Language: C++
Result: Wrong Answer
****************************************************************/