/* 2012-12-07T15:16:10 */
#define DEBUG_ON_
#define CONDITION true
using namespace std;/*{{{*/

#include <algorithm>
#include <cassert>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <sys/time.h>
#include <vector>

#define INF (1e9)
static const double PI = acos(-1.0);
static const double EPS = 1e-10;

typedef long long int LL;
typedef unsigned long long int ULL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<double> VD;
typedef vector<VD> VVD;
typedef vector<bool> VB;
typedef vector<VB> VVB;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef complex<double> P;

#define FOR(i, b, e) for (typeof(e) i = (b); i != (e); i < (e)? ++i : --i)
#define REP(i, n) FOR(i, 0, n)

#define IFC(c) if(c) continue;
#define IFB(c) if(c) break;
#define IFR(c, r) if(c) return r;

#define OPOVER(_op, _type) inline bool operator _op (const _type &t) const

#define arrsz(a) ( sizeof(a) / sizeof(a[0]) )

#define F first
#define S second
#define MP(a, b) make_pair(a, b)

#define SZ(a) ((LL)a.size())
#define PB(e) push_back(e)
#define SORT(v) sort((v).begin(), (v).end())
#define RSORT(v) sort((v).rbegin(), (v).rend())

#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define EACH(c,it) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it)
#define EXIST(s,e) ((s).find(e)!=(s).end())

#define BIT(n) (1ULL << (n))
#define BITOF(n, m) ((ULL)(n) >> (m) & 1)

#define RANGE(a, b, c) ((a) <= (b) && (b) <= (c))

#define PQ priority_queue
#define SC static_cast

#ifdef DEBUG_ON
#define dprt(fmt, ...) if (CONDITION) fprintf(stderr, fmt, __VA_ARGS__)
#define darr(a) if (CONDITION) copy( (a), (a) + arrsz(a), ostream_iterator<int>(cerr, " ") ); cerr << endl
#define darr_range(a, f, t) if (CONDITION) copy( (a) + (f), (a) + (t), ostream_iterator<int>(cerr, " ") ); cerr << endl
#define dvec(v) if (CONDITION) copy( ALL(v), ostream_iterator<int>(cerr, " ") ); cerr << endl
#define darr2(a, n, m) if (CONDITION) FOR(i, 0, (n)){ darr_range( (a)[i], 0, (m) ); }
#define dvec2(v) if (CONDITION) FOR(i, 0, SZ(v)){ dvec( (v)[i] ); }
#define WAIT() if (CONDITION) { string _wait_; cerr << "(hit return to continue)" << endl; getline(cin, _wait_); }
#define dump(x) if (CONDITION) cerr << " [L" << __LINE__ << "] " << #x << " = " << (x) << endl;
#define dumpf() if (CONDITION) cerr << __PRETTY_FUNCTION__ << endl;
#define dumpv(x) if (CONDITION) cerr << " [L:" << __LINE__ << "] " << #x << " = "; REP(q, (x).size()) cerr << (x)[q] << " "; cerr << endl;
#define where() if (CONDITION) cerr << __FILE__ << ": " << __PRETTY_FUNCTION__ << " [L: " << __LINE__ << "]" << endl;
#define show_bits(b, s) if(CONDITION) { REP(i, s) { cerr << BITOF(b, s-1-i); if(i%4 == 3) cerr << ' '; } cerr << endl; }
#else
#define cerr if(0) cerr
#define dprt(fmt, ...)
#define darr(a)
#define darr_range(a, f, t)
#define dvec(v)
#define darr2(a, n, m)
#define dvec2(v)
#define WAIT()
#define dump(x)
#define dumpf()
#define dumpv(x)
#define where()
#define show_bits(b, s)
#endif

inline int onbits_count(ULL b) { int c = 0; while(b != 0) { c += (b & 1); b >>= 1; } return c; }
inline int bits_count(ULL b) { int c = 0; while(b != 0) { ++c; b >>= 1; } return c; }
inline int toInt(string s) { int v; istringstream sin(s);sin>>v;return v; }
template<class T> inline string toString(T x) { ostringstream sout;sout<<x;return sout.str(); }
inline double now(){ struct timeval tv; gettimeofday(&tv, NULL); return (static_cast<double>(tv.tv_sec) + static_cast<double>(tv.tv_usec) * 1e-6); }
inline VS split(string s, char delimiter) { VS v; string t; REP(i, s.length()) { IFC(s[i] == ' '); if(s[i] == delimiter) v.PB(t), t = ""; else t += s[i]; } v.PB(t); return v; }

template<typename T1, typename T2> ostream& operator<<(ostream& s, const pair<T1, T2>& d) {return s << "(" << d.first << ", " << d.second << ")";}
/*}}}*/

int dx[] = {1, 0, -1, 0}; int dy[] = {0, -1, 0, 1};
enum dir {
	RIGHT, UP, LEFT, DOWN
};

struct frog {
	int x, y;
	dir d;
};

#define VC vector<char>
#define VVC vector< vector<char> >

int H, W;
VVC field;
frog frg;
int n_leaves = 1;
VC path;

void print_field() {
	REP (i, H) {
		REP (j, W) {
			cerr << field[i][j];
		}
		cerr << endl;
	}
}

void clear ()
{
	REP (i, path.size()) {
		cout << path[i];
	}
	cout << endl;
	exit(0);
}

PII find_leaf(dir d)
{
	int j = frg.x, i = frg.y;
	i += dy[d], j += dx[d];
	while (RANGE(0, i, H-1) && RANGE(0, j, W-1)) {
		dprt("(dir %d)search: [%d][%d] -> %c\n", d, i, j, field[i][j]);
		if (field[i][j] == 'o') {
			return MP(i, j);
		}
		i += dy[d], j += dx[d];
	}
	return MP(-1, -1);
}

void jump ()
{
	--n_leaves;
	print_field();
	WAIT();
	if (n_leaves == 0) {
		cerr << "CLEAR!" << endl;
		clear();
	}
	int savex = frg.x, savey = frg.y;
	dir saved = frg.d;
	if (frg.d != DOWN) {
		PII p = find_leaf(UP);
		if (p.F >= 0) {
			frg.y = p.F, frg.x = p.S;
			frg.d = UP;
			path.PB('U');
			field[p.F][p.S] = '.';
			cerr << "GO UP" << " " << p.F << ", " << p.S << endl;
			jump();
			++n_leaves;
			field[p.F][p.S] = 'o';
			path.pop_back();
			frg.x = savex, frg.y = savey, frg.d = saved;
		}
		else {
			cerr << "No leaf for up" << endl;
		}
	}
	if (frg.d != UP) {
		PII p = find_leaf(DOWN);
		if (p.F >= 0) {
			frg.y = p.F, frg.x = p.S;
			frg.d = DOWN;
			path.PB('D');
			field[p.F][p.S] = '.';
			cerr << "GO DOWN" << " " << p.F << ", " << p.S << endl;
			jump();
			++n_leaves;
			field[p.F][p.S] = 'o';
			path.pop_back();
			frg.x = savex, frg.y = savey, frg.d = saved;
		}
		else {
			cerr << "No leaf for down" << endl;
		}
	}
	if (frg.d != LEFT) {
		PII p = find_leaf(RIGHT);
		if (p.F >= 0) {
			frg.y = p.F, frg.x = p.S;
			frg.d = RIGHT;
			path.PB('R');
			field[p.F][p.S] = '.';
			cerr << "GO RIGHT" << " " << p.F << ", " << p.S << endl;
			jump();
			++n_leaves;
			field[p.F][p.S] = 'o';
			path.pop_back();
			frg.x = savex, frg.y = savey, frg.d = saved;
		}
		else {
			cerr << "No leaf for right" << endl;
		}
	}
	if (frg.d != RIGHT) {
		PII p = find_leaf(LEFT);
		if (p.F >= 0) {
			frg.y = p.F, frg.x = p.S;
			frg.d = LEFT;
			path.PB('L');
			field[p.F][p.S] = '.';
			cerr << "GO LEFT" << " " << p.F << ", " << p.S << endl;
			jump();
			++n_leaves;
			field[p.F][p.S] = 'o';
			path.pop_back();
			frg.x = savex, frg.y = savey, frg.d = saved;
		}
		else {
			cerr << "No leaf for left" << endl;
		}
	}
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	cin >> H >> W;
	field = VVC(H, VC(W));
	REP (i, H) {
		REP (j, W) {
			cin >> field[i][j];
			switch (field[i][j]) {/*{{{*/
				case 'U':
					frg.y = i, frg.x = j;
					frg.d = UP;
					break;
				case 'D':
					frg.y = i, frg.x = j;
					frg.d = DOWN;
					break;
				case 'R':
					frg.y = i, frg.x = j;
					frg.d = RIGHT;
					break;
				case 'L':
					frg.y = i, frg.x = j;
					frg.d = LEFT;
					break;
				case 'o':
					++n_leaves;
					break;
			}/*}}}*/
		}
	}
	dprt("Start: [%d][%d]\n", frg.y, frg.x);
	jump();
}

Measured memory_bytes: 1224