#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define int ll

#define REP(i,n) for(int i=0;i<n;++i)
#define SORT(name) sort(name.begin(), name.end())
#define ZERO(p) memset(p, 0, sizeof(p))
#define MINUS(p) memset(p, -1, sizeof(p))
#if 1
#  define DBG(fmt, ...) printf(fmt, ##__NA_ARGS__)
#else
#  define DBG(fmt, ...)
#endif

const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const double DINF = std::numeric_limits<double>::infinity();
const int MOD = 1000000007;
#define MAX_N 100010

ll N;
ll X[MAX_N];
ll Y[MAX_N];

int solve_small() {
    // マンハッタン距離で最大のものを求める
    ll m = 0;
    ll cnt_odd = 0, cnt_even = 0;
    REP(i, N) {
        m = max(m, abs(X[i]) + abs(Y[i]));
        if((abs(X[i]) + abs(Y[i])) % 2 == 0) { cnt_even++; }
        else { cnt_odd++; }
    }

    // 最短マンハッタン距離の偶奇が違うなら不可能
    if(cnt_odd > 0 && cnt_even > 0) {
        printf("-1\n");
        return 0;
    }
    assert(m <= 40);
    printf("%lld\n", m);
    REP(i, m) {
        printf("1");
        if(i != m-1) { printf(" "); }
        else { printf("\n"); }
    }
    REP(i, N) {
        // まず最短で目的地に向かう
        string dir_s = "";
        char dir = 'L';
        if(X[i] > 0) { dir = 'R'; }
        REP(j, abs(X[i])) { dir_s += dir; }
        if(Y[i] > 0) { dir = 'U'; }
        else { dir = 'D'; }
        REP(j, abs(Y[i])) { dir_s += dir; }

        // 目的地に着いたら適当に暇をつぶす
        ll remain = m - abs(X[i]) - abs(Y[i]);
        for(int j = 0; j < remain; j += 2) { dir_s += "LR"; }
        printf("%s\n", dir_s.c_str());
        assert(dir_s.length() == m);
    }
    return 0;
}

int solve_large() {
    ll cnt_odd = 0, cnt_even = 0;
    REP(i, N) {
        if((abs(X[i]) + abs(Y[i])) % 2 == 0) { cnt_even++; }
        else { cnt_odd++; }
    }
    // 最短マンハッタン距離の偶奇が違うなら不可能
    if(cnt_odd > 0 && cnt_even > 0) {
        printf("-1\n");
        return 0;
    }

    const int MaxBit = 32;
    vector<ll> D;

    // D の作成
    D.push_back(1);
    if(cnt_even > 0) { D.push_back(1); }
    {
        ll tmp = 2;
        for(ll i = 1; i <= MaxBit; ++i) {
            D.push_back(tmp);
            tmp *= 2;
        }
    }

    sort(D.begin(), D.end(), greater<ll>());

    // とりあえず m と D を出力
    printf("%zu\n", D.size());
    REP(j, D.size()) {
        printf("%lld", D[j]);
        if(j != D.size() - 1) { printf(" "); }
        else { printf("\n"); }
    }

    REP(i, N) {
        // X, Y 経路の作成
        string path = "";
        // 絶対値が大きい方に対して D の大きい値を加え差をなくしていく
        // X と Y の符号を反転してそこから 0 に戻ることを考える
        X[i] = -X[i];
        Y[i] = -Y[i];
        REP(j, D.size()) {
            if(abs(X[i]) > abs(Y[i])) {
                if(X[i] < 0) {
                    X[i] += D[j];
                    path += 'R';
                }
                else {
                    X[i] -= D[j];
                    path += 'L';
                }
            } else {
                if(Y[i] < 0) {
                    Y[i] += D[j];
                    path += 'U';
                }
                else {
                    Y[i] -= D[j];
                    path += 'D';
                }
            }
        }
        assert(X[i] == 0 && Y[i] == 0);
        //reverse(path.begin(), path.end());
        printf("%s\n", path.c_str());
    }

    return 0;
}

signed main()
{
    ll x_max = 0, y_max = 0;
    cin >> N;
    REP(i, N) {
        cin >> X[i] >> Y[i];
        x_max = max(x_max, abs(X[i]));
        y_max = max(y_max, abs(Y[i]));
    }

#if 0
    if(x_max <= 10 && y_max <= 10) {
        solve_small();
        return 0;
    }
#endif
    solve_large();

    return 0;
}


Measured memory_bytes: 256