#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (int i = 0; i < v.size(); i++) os << v[i] << " ";
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
  for (typename set<T>::iterator it = v.begin(); it != v.end(); it++)
    os << *it << " ";
}
const int mod = 1e9 + 7;
const int N = 2e5 + 5;
struct node {
  int l, r, w;
  node() {}
  node(int L, int R) {
    l = L;
    r = R;
  }
} dat[4 * N];
string s;
int n, m;
void up(int u) { dat[u].w = dat[u << 1].w + dat[u << 1 | 1].w; }
void build(int u, int l, int r) {
  dat[u] = node(l, r);
  if (l == r) {
    dat[u].w = 1;
    return;
  }
  int m = (l + r) >> 1;
  build(u << 1, l, m);
  build(u << 1 | 1, m + 1, r);
  up(u);
}
int query(int u, int w) {
  if (dat[u].l == dat[u].r) return dat[u].l;
  if (dat[u << 1].w >= w) {
    return query(u << 1, w);
  } else {
    return query(u << 1 | 1, w - dat[u << 1].w);
  }
}
void update(int l, int r, int u) {
  if (dat[u].l > r || dat[u].r < l) return;
  if (dat[u].l >= l && dat[u].r <= r) {
    dat[u].w = 0;
    return;
  }
  update(l, r, u << 1);
  update(l, r, u << 1 | 1);
  up(u);
}
set<int> S[62];
int main() {
  cin >> n >> m;
  cin >> s;
  for (int i = (0); i <= (n - 1); i++) {
    char c = s[i];
    int p;
    if (isdigit(c)) {
      p = c - '0';
    } else {
      if (65 <= c && c <= 90) {
        p = c - 65 + 10;
      }
      if (97 <= c && c <= 122) {
        p = c - 97 + 36;
      }
    }
    S[p].insert(i + 1);
  }
  build(1, 1, n);
  while (m--) {
    int l, r;
    char c;
    cin >> l >> r >> c;
    int L = query(1, l);
    int R = query(1, r);
    int p;
    if (isdigit(c)) {
      p = c - '0';
    } else {
      if (65 <= c && c <= 90) {
        p = c - 65 + 10;
      }
      if (97 <= c && c <= 122) {
        p = c - 97 + 36;
      }
    }
    vector<int> q;
    q.clear();
    set<int>::iterator it = lower_bound(S[p].begin(), S[p].end(), L);
    while (it != S[p].end() && (*it) <= R) {
      int pos = *it;
      update(pos, pos, 1);
      q.push_back(pos);
      it++;
    }
    for (int i = (0); i <= ((int)q.size() - 1); i++) {
      S[p].erase(q[i]);
    }
  }
  for (int i = (1); i <= (n); i++) {
    for (int j = (0); j <= (61); j++) {
      if (S[j].count(i)) {
        if (0 <= j && j <= 9) {
          printf("%c", j + '0');
        }
        if (10 <= j && j <= 35) {
          printf("%c", j - 10 + 65);
        }
        if (36 <= j && j <= 61) {
          printf("%c", j - 36 + 97);
        }
      }
    }
  }
}
