#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    string s;
    cin >> s;
    // upL[c]: 从小写开始,最终是否为大写;初始为小写(false)
    // upU[c]: 从大写开始,最终是否为大写;初始为大写(true)
    array<char, 26> upL{}, upU{};
    upL.fill(0);
    upU.fill(1);
    for (int i = 0; i < m; ++i) {
        int op;
        char L, R;
        cin >> op >> L >> R;
        if (op == 1) {
            int l = L - 'a', r = R - 'a';
            for (int c = l; c <= r; ++c) {
                // 只有当前是小写的才会被转成大写
                if (!upL[c]) upL[c] = 1;
                if (!upU[c]) upU[c] = 1; // 起始为大写的路径若曾被降小写,也会被此操作升回大写
            }
        } else { // op == 2
            int l = L - 'A', r = R - 'A';
            for (int c = l; c <= r; ++c) {
                // 只有当前是大写的才会被转成小写
                if (upL[c]) upL[c] = 0;
                if (upU[c]) upU[c] = 0;
            }
        }
    }
    // 将最终状态应用到字符串
    for (char& ch : s) {
        int idx = (ch >= 'a' ? ch - 'a' : ch - 'A');
        bool startUpper = isupper(static_cast<unsigned char>(ch));
        bool finalUpper = startUpper ? upU[idx] : upL[idx];
        ch = finalUpper ? char('A' + idx) : char('a' + idx);
    }
    cout << s << '\n';
    return 0;
}