def findIndex(c, m2d):
    return [(x,y) for x,v in enumerate(m2d) for y,n in enumerate(v)
            if n == c][0]

def neighbourhood(x,y,m2d):
    return ((x+i,y+j) for i,j in [(0,1),(0,-1),(1,0),(-1,0)]
            if m2d[x+i][y+j] != '#')

def diff(x,y): return abs(x[0]-y[0]) + abs(x[1]-y[1])

def solve(m2d):
    start, goal = findIndex('S', m2d), findIndex('G', m2d)
    openN, closeN = {start:(diff(start,goal), start)}, {}
    while openN != {}:
        (n,r) = sorted(openN.iteritems(), key=lambda(k,v):v[0])[0]
        closeN[n] = openN.pop(n)
        if n == goal: break
        for (x,y) in neighbourhood(n[0], n[1], m2d):
            v = r[0] - diff(goal,n) + diff(goal,(x,y)) + 1
            if (x,y) in openN and v < openN[x,y][0]:
                openN[x,y] = (v, n)
            if (x,y) in closeN and v < closeN[x,y][0]:
                openN[x,y] = (v, n)
                closeN.pop(x,y)
            if (x,y) not in openN and (x,y) not in closeN:
                openN[x,y] = (v,n)
    print_path(start, goal, closeN)

def print_path(start, goal, closeN):
    path, x = [], goal
    while x != start:
        y = closeN[x][1]
        if x[0] > y[0]: path.append('d')
        elif x[0] < y[0]: path.append('u')
        elif x[1] > y[1]: path.append('r')
        elif x[1] < y[1]: path.append('l')
        x = y
    print(''.join(reversed(path)))


solve([
'#######',
'#.....#',
'#.G.#.#',
'#..#..#',
'#.#.S.#',
'#.....#',
'#######'])