// Увидеть мир в одной песчинке
// И Космос весь в лесной травинке,
// Вместить в ладони бесконечность
// И в миге мимолетном вечность.

// Узнать об истинности лжи,
// Не поняв смысла, жизнь прожить,
// Принять рождение и смерть,
// И, улыбаясь, умереть.

// В минуту гнева и сомнений
// Иль в испытаниях больших
// Не верных не прими решений
// И делать вывод не спеши

// В период козней злого рока,
// В миг расставаний, в час рук
// Не падай духом раньше срока,
// Не опускай в бессилье рук.

#include <iostream>
#include <numeric>
#include <string>
#include <vector>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <deque>
#include <queue>
#include <stack>
#include <chrono>
#include <random>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
// using int128 = __int128_t;
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

ll MOD = 1e9 + 7;
struct mint {
    ll num;
    mint(ll _num) : num(_num) {}
    mint operator+(mint y) {
        if (num + y.num >= MOD) return num + y.num - MOD;
        return num + y.num;
    }
    mint operator-(mint y) {
        if (num - y.num < 0) return num - y.num + MOD;
        return num - y.num;
    }
    mint operator*(mint y) {
        return num * y.num % MOD;
    }
    mint pow(int n) {
        mint res = 1;
        mint a = *this;
        for (int i = 0; (1ll << i) <= n; ++i, a = a * a) {
            if ((n >> i) & 1) res = res * a;
        }
        return res;
    }
    mint inv() {
        return (*this).pow(MOD - 2);
    }
    mint operator/(mint y) {
        return num * y.inv().num % MOD;
    }
    void operator+=(mint y) {
        num = (*this + y).num;
    }
    void operator-=(mint y) {
        num = (*this - y).num;
    }
    void operator*=(mint y) {
        num = (*this * y).num;
    }
    void operator/=(mint y) {
        num = (*this / y).num;
    }
};
istream& operator>>(istream &in, mint &x) {
    in >> x.num;
    return in;
}
ostream& operator<<(ostream &out, mint &x) {
    out << x.num;
    return out;
}

struct segtree {
    struct node {
        int left = -1, right = -1;
    };
    vector<node> tree;
    int n;
    segtree(int _n) : n(_n), tree(1) {}
};

void solve() {
    int T;
    cin >> T;
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for (auto &el : a) cin >> el;
    string s;
    cin >> s;

    vector<int> cycle(n);
    for (int i = 0; i < n; ++i) {
        if (s[i] == 'R' || (s[i] == 'L' && a[i] == m)) {
            cycle[i] = a[i];
        } else {
            cycle[i] = 2 * m - a[i];
        }
    }

    int rest = cycle[0] % 2;
    for (int j = 1; j < n; ++j) {
        if (rest != cycle[j] % 2) {
            cout << "No";
            return;
        }
    }
    cout << "Yes\n";
    int min_m = 1e9;
    vector<pair<int, int>> qs;
    for (int i = 0; i < m; ++i) {
        if (2 * m - cycle[0] == cycle[1]) {
            min_m = min(2 * m - cycle[0], cycle[0]);
            qs.emplace_back(i, min_m);
            break;
        }
        cycle[0]++, cycle[1]++;
        if (cycle[0] > 2 * m - 2) {
            cycle[0] = 2 * m - cycle[0];
        }
        if (cycle[1] > 2 * m - 2) {
            cycle[1] = 2 * m - cycle[1];
        }
    }
    if (T != 1) {
        cout << min_m << '\n';
    }
    if (T == 3) {
        cout << sz(qs) << '\n';
        for (auto el : qs) cout << el.first << ' ' << el.second;
    }
}

#define LOCAL
int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}