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;
namespace IO {
const int sz = 1 << 15;
char inbuf[sz], outbuf[sz];
char *pinbuf = inbuf + sz;
char *poutbuf = outbuf;
inline char _getchar() {
  if (pinbuf == inbuf + sz) fread(inbuf, 1, sz, stdin), pinbuf = inbuf;
  return *(pinbuf++);
}
inline void _putchar(char x) {
  if (poutbuf == outbuf + sz) fwrite(outbuf, 1, sz, stdout), poutbuf = outbuf;
  *(poutbuf++) = x;
}
inline void flush() {
  if (poutbuf != outbuf)
    fwrite(outbuf, 1, poutbuf - outbuf, stdout), poutbuf = outbuf;
}
}  // namespace IO
inline int read() {
  int v = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    v = v * 10 + c - '0';
    c = getchar();
  }
  return v * f;
}
const int Maxn = 1005;
const int B = 101;
const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};
const char ch[] = "UDRL";
int vx, vy, sx, sy, m;
int occ[Maxn][Maxn];
int par[Maxn * Maxn];
int findset(int x) { return par[x] = (par[x] == x) ? x : findset(par[x]); }
void Union(int x, int y) {
  x = findset(x);
  y = findset(y);
  par[x] = y;
}
int dist[Maxn][Maxn], prvx[Maxn][Maxn], prvy[Maxn][Maxn];
char op[Maxn][Maxn];
int qx[Maxn * Maxn], qy[Maxn * Maxn], eq, sq;
void bfs(int x, int y, int D) {
  for (int i = 0; i <= D; i++) {
    for (int j = 0; j <= D; j++) {
      dist[i][j] = -1;
    }
  }
  dist[x][y] = 0;
  sq = eq = 0;
  qx[eq] = x;
  qy[eq++] = y;
  while (sq < eq) {
    int X = qx[sq], Y = qy[sq++];
    for (int i = 0; i < 4; i++) {
      int nx = X + dx[i], ny = Y + dy[i];
      if (nx >= 0 && ny >= 0 && nx <= D && ny <= D && !occ[nx][ny]) {
        if (dist[nx][ny] == -1) {
          dist[nx][ny] = dist[X][Y] + 1;
          prvx[nx][ny] = X;
          prvy[nx][ny] = Y;
          op[nx][ny] = ch[i];
          qx[eq] = nx;
          qy[eq++] = ny;
        }
      }
    }
  }
}
bool BL(int x, int y) {
  return x >= 0 && y >= 0 && x <= 205 && y <= 205 && occ[x][y];
}
void Move(char t) {
  if (t == 'L') {
    sx--;
    vx--;
    if (BL(vx, vy)) vx++;
  } else if (t == 'R') {
    sx++;
    vx++;
    if (BL(vx, vy)) vx--;
  } else if (t == 'U') {
    sy++;
    vy++;
    if (BL(vx, vy)) vy--;
  } else {
    sy--;
    vy--;
    if (BL(vx, vy)) vy++;
  }
  assert(!BL(sx, sy));
}
int Bx[Maxn], By[Maxn];
int main() {
  vx = read();
  vy = read();
  sx = read();
  sy = read();
  swap(vx, sx);
  swap(vy, sy);
  vx += B;
  vy += B;
  sx += B;
  sy += B;
  m = read();
  if (m == 0) {
    puts("-1");
    return 0;
  }
  for (int i = 0; i < m; i++) {
    int x, y;
    x = read();
    y = read();
    x += B;
    y += B;
    Bx[i] = x;
    By[i] = y;
    occ[x][y] = 1;
  }
  for (int i = 1; i <= 500; i++)
    for (int j = 1; j <= 500; j++) par[i * Maxn + j] = i * Maxn + j;
  for (int i = 1; i <= 500; i++) {
    for (int j = 1; j <= 500; j++) {
      if (!occ[i][j]) {
        for (int k = 0; k < 4; k++) {
          int ni = i + dx[k], nj = j + dy[k];
          if (!occ[ni][nj]) {
            Union(i * Maxn + j, ni * Maxn + nj);
          }
        }
      }
    }
  }
  if (findset(vx * Maxn + vy) != findset(sx * Maxn + sy)) {
    printf("-1\n");
    return 0;
  }
  string ans;
  if (findset(vx * Maxn + vy) == findset(500 * Maxn + 500)) {
    bfs(sx, sy, 1000);
    string tmp;
    int tx = 500, ty = 500;
    while (tx != sx || ty != sy) {
      tmp += op[tx][ty];
      int _ = prvx[tx][ty], __ = prvy[tx][ty];
      tx = _;
      ty = __;
    }
    reverse(tmp.begin(), tmp.end());
    ans += tmp;
    for (int i = 0; i < ans.size(); i++) Move(ans[i]);
    bfs(vx, vy, 1000);
    tmp = "";
    tx = 500, ty = 500;
    while (tx != vx || ty != vy) {
      tmp += op[tx][ty];
      int _ = prvx[tx][ty], __ = prvy[tx][ty];
      tx = _;
      ty = __;
    }
    reverse(tmp.begin(), tmp.end());
    for (int i = 0; i < tmp.size(); i++) Move(tmp[i]);
    ans += tmp;
    if (sx > vx) {
      int Mx = -1e9, My;
      for (int i = 0; i < m; i++) {
        if (Bx[i] > Mx) {
          Mx = Bx[i];
          My = By[i];
        }
      }
      while (vy > My) {
        Move('D');
        ans += 'D';
      }
      while (vy < My) {
        Move('U');
        ans += 'U';
      }
      while (vx != sx) {
        Move('L');
        ans += 'L';
      }
      for (int i = 0; i < 500; i++) {
        Move('U');
        Move('R');
        ans += "UR";
      }
    } else if (sx < vx) {
      int Mx = 1e9, My;
      for (int i = 0; i < m; i++) {
        if (Bx[i] < Mx) {
          Mx = Bx[i];
          My = By[i];
        }
      }
      while (vx >= 0) {
        Move('L');
        ans += 'L';
      }
      while (vy > My) {
        Move('D');
        ans += 'D';
      }
      while (vy < My) {
        Move('U');
        ans += 'U';
      }
      while (vx != sx) {
        Move('R');
        ans += 'R';
      }
      for (int i = 0; i < 1000; i++) {
        Move('U');
        ans += "U";
      }
      for (int i = 0; i < 1000; i++) {
        Move('R');
        ans += "R";
      }
    }
    assert(sx == vx);
    if (sy > vy) {
      int Mx, My = -1e9;
      for (int i = 0; i < m; i++) {
        if (By[i] > My) {
          Mx = Bx[i];
          My = By[i];
        }
      }
      while (vx > Mx) {
        Move('L');
        ans += 'L';
      }
      while (vx < Mx) {
        Move('R');
        ans += 'R';
      }
      while (vy != sy) {
        Move('D');
        ans += 'D';
      }
    } else {
      int Mx, My = 1e9;
      for (int i = 0; i < m; i++) {
        if (By[i] < My) {
          Mx = Bx[i];
          My = By[i];
        }
      }
      while (vy >= 0) {
        Move('D');
        ans += 'D';
      }
      while (vx > Mx) {
        Move('L');
        ans += 'L';
      }
      while (vx < Mx) {
        Move('R');
        ans += 'R';
      }
      while (vy != sy) {
        Move('U');
        ans += 'U';
      }
    }
    assert(sx == vx && sy == vy);
    printf("%s\n", ans.c_str());
    return 0;
  }
  while (vx != sx || vy != sy) {
    bfs(sx, sy, 200);
    int tx = vx, ty = vy;
    string tmp;
    while (tx != sx || ty != sy) {
      tmp += op[tx][ty];
      int _ = prvx[tx][ty], __ = prvy[tx][ty];
      tx = _;
      ty = __;
    }
    reverse(tmp.begin(), tmp.end());
    ans += tmp;
    for (int i = 0; i < tmp.size(); i++) Move(tmp[i]);
  }
  printf("%s\n", ans.c_str());
  return 0;
}