#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e2 + 5;
char grid[MAX][MAX];
const vector<pair<int, int> > dir{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
const vector<char> moves{'L', 'R', 'D', 'U'};
int n, m;
pair<int, int> start, ending;
bool inside(int x, int y) { return x >= 1 && x <= n && y >= 1 && y <= m; }
int back(char c) { return find(moves.begin(), moves.end(), c) - moves.begin(); }
char other(char c) {
  if (c == 'L') {
    return 'R';
  } else if (c == 'R') {
    return 'L';
  } else if (c == 'U') {
    return 'D';
  }
  return 'U';
}
pair<int, int> ask(char c) {
  printf("%c\n", c);
  fflush(stdout);
  int x, y;
  scanf("%d %d%*c", &x, &y);
  return pair<int, int>(x, y);
}
pair<int, int> from[MAX][MAX];
char moves_from[MAX][MAX];
bool visited[MAX][MAX];
void bfs(pair<int, int> source) {
  queue<pair<int, int> > q;
  q.push(source);
  visited[source.first][source.second] = true;
  while (!q.empty()) {
    pair<int, int> cur = q.front();
    q.pop();
    int x = cur.first, y = cur.second;
    for (int i = int(0); i < int(dir.size()); i++) {
      int nx = x + dir[i].first;
      int ny = y + dir[i].second;
      if (inside(nx, ny) && !visited[nx][ny] && grid[nx][ny] != '*') {
        visited[nx][ny] = true;
        from[nx][ny] = pair<int, int>(x, y);
        moves_from[nx][ny] = moves[i];
        q.emplace(nx, ny);
      }
    }
  }
}
int main() {
  memset(grid, '.', sizeof grid);
  scanf("%d %d%*c", &n, &m);
  start = pair<int, int>(1, 1);
  for (int i = int(1); i < int(n + 1); i++) {
    for (int j = int(1); j < int(m + 1); j++) {
      scanf("%c", &grid[i][j]);
      if (grid[i][j] == 'F') {
        ending = pair<int, int>(i, j);
      }
    }
    scanf("%*c");
  }
  bfs(start);
  vector<char> path;
  pair<int, int> cur = ending;
  while (cur != start) {
    path.push_back(moves_from[cur.first][cur.second]);
    cur = from[cur.first][cur.second];
  }
  reverse(path.begin(), path.end());
  pair<int, int> pos = pair<int, int>(1, 1);
  bool LRswapped = false, UDswapped = false;
  bool LRalready = false, UDalready = false;
  for (int i = 0; i < (int)path.size() && pos != ending; i++) {
    pair<int, int> next_pos = pos;
    next_pos.first += dir[back(path[i])].first;
    next_pos.second += dir[back(path[i])].second;
    if (path[i] == 'L' || path[i] == 'R') {
      if (!LRalready) {
        LRalready = true;
        pair<int, int> p = ask(path[i]);
        if (p != next_pos) {
          LRswapped = true;
          if (p != pos) {
            ask(other(path[i]));
          }
        } else {
          ask(other(path[i]));
        }
      }
      ask(LRswapped ? other(path[i]) : path[i]);
    } else {
      if (!UDalready) {
        UDalready = true;
        pair<int, int> p = ask(path[i]);
        if (p != next_pos) {
          UDswapped = true;
          if (p != pos) {
            ask(other(path[i]));
          }
        } else {
          ask(other(path[i]));
        }
      }
      ask(UDswapped ? other(path[i]) : path[i]);
    }
    pos = next_pos;
  }
  return 0;
}
