#include <bits/stdc++.h>   using namespace std;   template <typename T>   void read(T &x) {     x = 0;     char ch = getchar();     int fh = 1;     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) fh = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) x = x * 10 + ch -  0 , ch = getchar();     x *= fh;   }   struct Po {     long long x, y, t;   } po[200010], b[200010], c[200010];   struct shj {     long long t, x, zh;   } a[200010];   int n, l;   string an, no;   bool vi[2000010][2];   bool c1(const shj &a, const shj &b) { return a.t < b.t; }   bool c2(const Po &a, const Po &b) { return a.t < b.t; }   void check(long long x) {     for (int i = 1; i <= n; i++) {       long long no = b[i].t / l;       c[i] = b[i];       c[i].x -= x * no;       c[i].t %= l;     }     sort(c + 1, c + n + 1, c2);     c[n + 1].t = l;     c[n + 1].x = x;     no =   ;     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= c[i + 1].t - c[i].t - c[i + 1].x + c[i].x; j++)         no +=  0 ;       for (int j = 1; j <= c[i + 1].x - c[i].x; j++) no +=  1 ;     }     if (an ==   )       an = no;     else if (no < an)       an = no;   }   int main() {     read(n);     read(l);     for (int i = 1; i <= n; i++) {       read(po[i].t);       read(po[i].x);       read(po[i].y);     }     po[++n] = (Po){0, 0, 0};     for (int i = 1; i <= n; i++) {       a[i].t = po[i].t % l;       a[i].x = po[i].x + po[i].y + po[i].t;       b[i].x = (po[i].x + po[i].y + po[i].t) / 2;       b[i].t = po[i].t;       if (a[i].x % 2 == 1 || a[i].x < 0) {         puts( NO );         return 0;       } else         a[i].x /= 2;       a[i].zh = po[i].t / l;     }     a[n + 1] = (shj){l, 0, -1};     sort(a + 1, a + n + 2, c1);     long long nl = 0, nr = l;     for (int i = 1; i <= n; i++) {       long long x = a[i + 1].t - a[i].t, y = a[i + 1].zh - a[i].zh,                 z = a[i + 1].x - a[i].x;       if (y > 0) {         if ((z - x) % y == 0)           nl = max(nl, (z - x) / y);         else           nl = max(nl, (z - x) / y + 1);         nr = min(nr, z / y);       }       if (y < 0) {         z = -z;         y = -y;         if (z % y == 0)           nl = max(nl, z / y);         else           nl = max(nl, z / y + 1);         nr = min(nr, (z + x) / y);       }     }     if (nl > nr) {       puts( NO );       return 0;     }     an =   ;     check(nl);     check(nr);     for (int i = 1; i <= l; i++) vi[i][0] = an[i - 1] -  0 ;     for (int i = 1; i <= n; i++) {       a[i].t = po[i].t % l;       a[i].x = po[i].y - po[i].x + po[i].t;       b[i].x = (po[i].y - po[i].x + po[i].t) / 2;       b[i].t = po[i].t;       if (a[i].x % 2 == 1 || a[i].x < 0) {         puts( NO );         return 0;       } else         a[i].x /= 2;       a[i].zh = po[i].t / l;     }     a[n + 1] = (shj){l, 0, -1};     sort(a + 1, a + n + 2, c1);     nl = 0, nr = l;     for (int i = 1; i <= n; i++) {       long long x = a[i + 1].t - a[i].t, y = a[i + 1].zh - a[i].zh,                 z = a[i + 1].x - a[i].x;       if (y > 0) {         if ((z - x) % y == 0)           nl = max(nl, (z - x) / y);         else           nl = max(nl, (z - x) / y + 1);         nr = min(nr, z / y);       }       if (y < 0) {         z = -z;         y = -y;         if (z % y == 0)           nl = max(nl, z / y);         else           nl = max(nl, z / y + 1);         nr = min(nr, (z + x) / y);       }     }     if (nl > nr) {       puts( NO );       return 0;     }     an =   ;     check(nl);     check(nr);     for (int i = 1; i <= l; i++) vi[i][1] = an[i - 1] -  0 ;     for (int i = 1; i <= l; i++) printf( %c ,  DLRU [2 * vi[i][0] + vi[i][1]]);     puts(  );     return 0;   }