#include <bits/extc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx,avx2") 
#define int long long

using namespace std;
using namespace __gnu_pbds;

const int inf = 1e12;

struct segtree {
    int n;
    vector<int> t;

    segtree(int _n, const vector<int> &a) {
        n = _n;
        t.resize(4 * n, -inf);
        build(0, 0, n, a);
    }

    void build(int v, int l, int r, const vector<int> &a) {
        if (l + 1 == r) {
            t[v] = a[l];
        } else {
            int m = (l + r) / 2;
            build(2 * v + 1, l, m, a);
            build(2 * v + 2, m, r, a);
            t[v] = max(t[2 * v + 1], t[2 * v + 2]);
        }
    }

    void update(int v, int l, int r, int i, int x) {
        if (l + 1 == r) {
            t[v] = x;
        } else {
            int m = (l + r) / 2;
            if (i < m) {
                update(2 * v + 1, l, m, i, x);
            } else {
                update(2 * v + 2, m, r, i, x);
            }
            t[v] = max(t[2 * v + 1], t[2 * v + 2]);
        }
    }

    void update(int i, int x) {
        update(0, 0, n, i, x);
    }

    int query(int v, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) {
            return t[v];
        } else if (qr <= l || r <= ql) {
            return -inf;
        } else {
            int m = (l + r) / 2;
            return max(query(2 * v + 1, l, m, ql, qr),
                        query(2 * v + 2, m, r, ql, qr));
        }
    }

    int query(int l, int r) {
        return query(0, 0, n, l, r);
    }
};

pair<int, int> inter(int x, int y, int dx, int dy, int m) {
    if (x % 2 != y % 2) {
        return {-1, -1};
    }
    if (y < x) {
        swap(x, y);
    }
    if (x == y) {
        return {0, x};
    }
    if (dx == 1 && dy == -1) {
        return {(y - x) / 2, x + (x - y) / 2};
    } else if (dx == 1 && dy == 1) {
        return {(m - 1 - y) + (y - x) / 2, x + (m - 1 - y) + (y - x) / 2};
    } else if (dx == -1 && dy == 1) {
        return {m - 1 - (y - x) / 2, m - (x + y) / 2 - 1};
    } else {
        return {x + (y - x) / 2, (y - x) / 2};
    }
}

int pos(int x, int dx, int t, int m) {
    t %= 2 * (m - 1);
    while (t > 0) {
        if (dx == 1) {
            int d = min(t, m - 1 - x);
            x += d;
            t -= d;
            dx *= -1;
        } else {
            int d = min(x, t);
            x -= d;
            t -= d;
            dx *= -1;
        }
    }
    return x;
}

void solve() {
    int t; cin >> t;
    int n, m; cin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i]; --a[i];
    }
    vector<int> d(n);
    for (int i = 0; i < n; ++i) {
        char c; cin >> c;
        d[i] = (c == 'R'? +1: -1);
    }
    if (a[1] > a[0]) {
        swap(a[1], a[0]);
        swap(d[1], d[0]);
    }
    int curt = 0;
    vector<pair<int, int>> ans;
    
    int cnt[2]; cnt[0] = cnt[1] = 0;
    for (int i = 0; i < n; ++i) {
        ++cnt[a[i] % 2]; 
    }
    if (min(cnt[0], cnt[1]) > 0) {
        cout << "No\n";
        return;
    } else {
        cout << "Yes\n";
    }
        // if (a[1] == m - 1) {
        //     ++curt;
        //     a[1] += d[1];
        //     a[0] += d[0];
        //     ans.push_back({1, --m});
        // } else {
        //     ans.push_back({0, --m});
        // }
    auto [it, ix] = inter(a[0], a[1], d[0], d[1], m);
    if (ix < m + ix - 1) {
        it += m - 1;
    }
    int iv = pos(a[0], d[0], it, m) + 1;
    cout << iv << '\n';
    cout << 1 << '\n';
    cout << it << ' ' << iv << '\n';
}

signed main(void) {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    solve();
}