#include <bits/stdc++.h>
struct {
  inline operator int() {
    int x;
    return scanf("%d", &x), x;
  }
  inline operator long long() {
    long long x;
    return scanf("%lld", &x), x;
  }
  inline operator char() {
    char x[3];
    return scanf("%s", x), *x;
  }
} read;
const int maxn = 200005, maxm = 2000005;
long long pos[2][maxn], ti[maxn];
int get[2][maxm];
struct Limit {
  long long p, a, b;
} li[maxn];
void solve(int o, int n, int m) {
  for (int i = 1; i <= n; i++) li[i] = {pos[o][i], ti[i] / m, ti[i] % m};
  std::sort(li + 1, li + n + 1, [](Limit x, Limit y) { return x.b < y.b; });
  li[0] = {0, 0, 0};
  li[n + 1] = {0, -1, m};
  long long Lx = 0, Rx = 1000000000000000000;
  for (int i = 1; i <= n + 1; i++) {
    if (i < n) {
      Lx = std::max(Lx, (li[i].p + li[i].a) / (li[i].a + 1));
      if (li[i].a) Rx = std::min(Rx, li[i].p / li[i].a);
    }
    long long dp = li[i].p - li[i - 1].p;
    long long da = li[i].a - li[i - 1].a;
    long long L = 0, R = li[i].b - li[i - 1].b;
    if (da < 0) {
      dp = -dp;
      da = -da;
      L = -R;
      R = 0;
    }
    if (da) {
      Lx = std::max(Lx, (dp - R + da - 1) / da);
      Rx = std::min(Rx, (dp - L) / da);
    } else if (dp < L or dp > R)
      puts("NO"), exit(0);
  }
  if (Lx > Rx) puts("NO"), exit(0);
  long long x = Lx;
  for (int i = 1; i <= n + 1; i++) {
    long long dis = li[i].p - li[i - 1].p - (li[i].a - li[i - 1].a) * x;
    for (int j = li[i].b - dis + 1; j <= li[i].b; j++) get[o][j] = 1;
  }
}
int main() {
  int n = read, m = read;
  for (int i = 1; i <= n; i++) {
    ti[i] = read;
    long long x = read, y = read;
    pos[0][i] = x - y + ti[i];
    pos[1][i] = x + y + ti[i];
    if ((pos[0][i] & 1) or (pos[1][i] & 1)) puts("NO"), exit(0);
    pos[0][i] >>= 1;
    pos[1][i] >>= 1;
  }
  solve(0, n, m);
  solve(1, n, m);
  char s[5] = "LDUR";
  for (int i = 1; i <= m; i++) putchar(s[get[1][i] << 1 | get[0][i]]);
  puts("");
}
