Problem: Princess Vlada enjoys springing in the meadows and walking in the forest. One day — wonderful, sunny day — during her walk Princess found out with astonishment that her shadow was missing! "Blimey!", — she thought and started her search of the shadow in the forest.

Normally the Shadow is too lazy and simply sleeps under the Princess. But at this terrifically hot summer day she got bored of such a dull life, so she decided to play with Vlada.

The forest, where our characters entertain themselves, may be represented as a set of integer cells in the plane, where the Shadow and the Princess can move only up, down, left and right by 1. Some cells (as it happens in decent forests) are occupied by trees. The Shadow and the Princess are not allowed to enter a cell occupied by a tree. Unfortunately, these are the hard times for the forest, so there are very few trees growing here...

At first the Princess was walking within the cell (vx, vy), while the Shadow hid from the Princess in the cell (sx, sy). The Princess, The Shadow and the trees are located in the different cells.

The Shadow is playing with the Princess. As soon as the Princess moves by 1 in some direction, the Shadow simultaneously flies by 1 in the same direction, if it is possible (if the cell to fly to is not occupied by some tree); otherwise, the Shadow doesn't move. The Shadow is very shadowy, so our characters do not interfere with each other.

We say that the Shadow is caught by the Princess if after some move both of them are located in the same cell. Vlada managed to catch her Shadow! Can you?

Input

First line of the input contains the coordinates of the characters vx, vy, sx, sy and the number of trees m (0 ≤ m ≤ 400). The following m lines contain the coordinates of the trees.

All the coordinates are integers between -100 and 100, inclusive. The Princess, The Shadow and the trees are located in the different cells.

Output

If it is impossible for the Princess to catch the Shadow, print "-1" (without quotes).

Otherwise print a sequence of characters "L", "R", "D", "U", corresponding to the Princess's moves, following which she will be able to catch the Shadow at some turn (L — move to the left, R — to the right, U — up, D — down; axis x is directed to the right, y — up).

The number of characters (that is, the number of moves) must not exceed 106. All the Princess's moves should be correct, that is must not lead to the cell where a tree grows. It is allowed for the Princess and the Shadow to occupy the same cell before the last turn.

Examples

Input

0 0 1 0 1
0 1


Output

LLUR


Input

5 0 3 0 8
2 -1
2 0
2 1
3 -1
4 1
4 0
3 1
4 -1


Output

-1


Input

3 2 1 1 3
0 1
1 0
0 0


Output

DLL

Note

Below the pictures for the samples are given (Princess, Shadow and the trees are colored in pink, gray and black correspondingly; the blue dot marks the lattice center).

In the first case the Princess may make two left steps, one step upwards and one right step: <image>

In the following case the Princess cannot catch the Shadow: <image>

In the last sample the Princess may make two left steps and one down step (in any order): <image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const char *goChar = "LURD";
const int go[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
const int maxc = 302;
int trees[maxc * 2 + 1][maxc * 2 + 1];
inline bool inBorder(int x, int y) {
  return x == maxc || x == -maxc || y == maxc || y == -maxc;
}
inline bool ok(int x, int y) {
  return -maxc <= x && x <= maxc && -maxc <= y && y <= maxc;
}
inline bool haveTrees(int x, int y) {
  return ok(x, y) && trees[y + maxc][x + maxc];
}
struct Point {
  int x, y;
  bool makeMove(int g) {
    int nx = x + go[g][0], ny = y + go[g][1];
    if (!haveTrees(nx, ny)) {
      x = nx, y = ny;
      return 1;
    }
    return 0;
  }
  inline bool operator==(const Point &p) const { return x == p.x && y == p.y; }
} she, team;
string res;
bool makeMove(int g, int should = -1) {
  res += goChar[g];
  int tmp = team.makeMove(g);
  if (should != -1) assert(tmp == should);
  assert(she.makeMove(g));
  return tmp;
}
int path[maxc * 5];
const int maxx = 2 * maxc + 1;
int dist[maxx][maxx], pr[maxx][maxx];
int st[maxx * maxx][2];
void findPath(int x0, int y0, int xe, int ye, int *gs, int &len,
              int border = 0) {
  for (int y = -maxc; y <= maxc; ++y)
    for (int x = -maxc; x <= maxc; ++x) dist[y + maxc][x + maxc] = ((int)1e9);
  if (border) assert(abs(x0) == maxc || abs(y0) == maxc);
  int r = 0;
  st[r][0] = x0, st[r][1] = y0, ++r;
  dist[y0 + maxc][x0 + maxc] = 0;
  bool found = 0;
  for (int l = 0; !found && l < r; ++l) {
    int x = st[l][0], y = st[l][1];
    int curd = dist[y + maxc][x + maxc] + 1;
    for (int g = 0; g < 4; ++g) {
      int nx = x + go[g][0], ny = y + go[g][1];
      if (!ok(nx, ny) || haveTrees(nx, ny)) continue;
      if (border && (abs(nx) != maxc && abs(ny) != maxc)) continue;
      int &toupdate = dist[ny + maxc][nx + maxc];
      if (toupdate > curd) {
        toupdate = curd;
        pr[ny + maxc][nx + maxc] = g;
        st[r][0] = nx, st[r][1] = ny, ++r;
        if (nx == xe && ny == ye) {
          found = 1;
          break;
        }
      }
    }
  }
  len = dist[ye + maxc][xe + maxc];
  if (len == ((int)1e9)) return;
  for (int x = xe, y = ye, it = 0; !(x == x0 && y == y0); ++it) {
    assert(it <= len - 1);
    int g = gs[len - 1 - it] = pr[y + maxc][x + maxc];
    x -= go[g][0], y -= go[g][1];
  }
}
bool solve() {
  int n;
  if (scanf("%d%d%d%d%d", &she.x, &she.y, &team.x, &team.y, &n) < 5) return 0;
  memset(trees, 0, sizeof(trees));
  for (int i = 0; i < n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    trees[y + maxc][x + maxc] = 1;
  }
  if (!n) {
    assert(!(she == team));
    printf("-1\n");
    return 1;
  }
  {
    int len;
    findPath(team.x, team.y, she.x, she.y, path, len);
    if (len == ((int)1e9)) {
      printf("-1\n");
      return 1;
    }
  }
  res = "";
  int len = 0;
  int l = 0;
  while (!(team == she) && !inBorder(team.x, team.y)) {
    if (l == len) {
      findPath(she.x, she.y, team.x, team.y, path, len);
      l = 0;
    }
    assert(len != ((int)1e9) && len > 0);
    makeMove(path[l]);
    ++l;
  }
  for (int g = 0; g < 4; g++) {
    if ((team.x - she.x) * go[g][0] + (team.y - she.y) * go[g][1] <= 0)
      continue;
    Point where;
    where.x = -((int)1e9);
    for (int x = -maxc, tmp = ((int)1e9); x <= maxc; x++) {
      for (int y = -maxc; y <= maxc; y++) {
        if (haveTrees(x, y) && x * go[g][0] + y * go[g][1] < tmp) {
          tmp = x * go[g][0] + y * go[g][1];
          where.x = x, where.y = y;
        }
      }
    }
    assert(where.x != -((int)1e9));
    int added = 0;
    Point firstly = where;
    while (abs(firstly.x) < maxc && abs(firstly.y) < maxc) {
      assert(firstly.makeMove(g ^ 2));
      added++;
    }
    int len;
    findPath(team.x, team.y, firstly.x, firstly.y, path, len, 1);
    assert(len != ((int)1e9));
    for (int i = 0; i < len; i++) makeMove(path[i], 1);
    for (int i = 0; i < added - 1; i++) makeMove(g, 1);
    while ((team.x - she.x) * go[g][0] + (team.y - she.y) * go[g][1])
      makeMove(g, 0);
    for (int i = 0; i < added - 1; i++) makeMove(g ^ 2, 1);
    assert(abs(team.x) == maxc || abs(team.y) == maxc);
  }
  assert(team == she);
  printf("%s\n", res.c_str());
  return 1;
}
int main() {
  srand(rdtsc());
  while (1) {
    if (!solve()) break;
  }
  return 0;
}