#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

set <long long> used;

struct move
{
    int x;
    int y;
    char tp;
};

vector <move> moves;

int field[200][200], n, m, k, p;

long long encode()
{
    int i, j;
    long long cd = 0, base = 1;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
        {
            cd += base * field[i][j];
            base *= 3;
        }
    return cd;
}

bool nice_one()
{
    int i, j;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            if (field[i][j] == 1)
                return false;
    return true;
}

bool rec()
{
    //fprintf(stderr,"ok\n");
    long long cd = encode();
    if (used.find(cd) != used.end())
        return false;
    else
        used.insert(cd);

    int i, j;
    if (nice_one())
        return true;

    for (i = 1; i <= n - 1; i++)
        for (j = 1; j <= m; j++)
            if (field[i][j] == 2)
            {
                if (field[i + 1][j] == 0)
                {
                    field[i][j] = 0;
                    field[i + 1][j] = 2;
                    move mv;
                    mv.x = i;
                    mv.y = j;
                    mv.tp = 'F';
                    moves.push_back(mv);
                    if (rec())
                        return true;
                    moves.pop_back();
                    field[i][j] = 2;
                    field[i + 1][j] = 0;

                }
                if (field[i + 1][j + 1] == 1)
                {
                    field[i + 1][j + 1] = 2;
                    field[i][j] = 0;
                    move mv;
                    mv.x = i;
                    mv.y = j;
                    mv.tp = 'R';
                    moves.push_back(mv);
                    if (rec())
                        return true;
                    moves.pop_back();field[i + 1][j + 1] = 1;
                    field[i][j] = 2;
                }
                if (field[i + 1][j - 1] == 1)
                {
                    field[i + 1][j - 1] = 2;
                    field[i][j] = 0;
                    move mv;
                    mv.x = i;
                    mv.y = j;
                    mv.tp = 'L';
                    moves.push_back(mv);
                    if (rec())
                        return true;
                    moves.pop_back();field[i + 1][j - 1] = 1;
                    field[i][j] = 2;
                }
            }
    return false;
}


int main()
{
    int i, j, x, y;
    freopen("pawns.in", "r", stdin);
    freopen("pawns.out", "w", stdout);

    scanf("%d%d%d%d", &n, &m, &p, &k);

    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            field[i][j] = 0;

    for (i = 0; i < p; i++)
    {
        scanf("%d", &y);
        field[1][y] = 2;
    }

    for (i = 0; i < k; i++)
    {
        scanf("%d%d", &x, &y);
        field[x][y] = 1;
    }
    if (rec())
    {
        printf("YES\n");
        printf("%d\n", moves.size());
        for (i = 0; i < moves.size(); i++)
            printf("%d %d %c\n", moves[i].x, moves[i].y, moves[i].tp);
    }
    else
        printf("NO");
}
