#include <bits/stdc++.h>
using namespace std;
struct BIT {
  vector<long long> a;
  BIT(int n) : a(n + 1, 0) {}
  void upd(int i, long long x) {
    for (; i < (int)((a).size()); i += i & -i) a[i] += x;
  }
  long long query(int i, int j = 0) {
    long long ai = 0, aj = 0;
    while (i | j) {
      ai += i ? a[i] : 0;
      aj += j ? a[j] : 0;
      i -= i & -i, j -= j & -j;
    }
    return ai - aj;
  }
  int search(long long x) {
    long long y = 0;
    int p = 0, t = 1 << 20;
    while (t) {
      if ((p | t) < (int)((a).size()) && y + a[p | t] < x) p |= t, y += a[p];
      t >>= 1;
    }
    return p + 1;
  }
};
const int A = 257;
set<int> I[A];
void solve() {
  int n, m;
  cin >> n >> m;
  string s;
  cin >> s;
  for (int i = 0; i < A; i++) I[i].clear();
  for (int i = 0; i < n; i++) I[s[i]].insert(i + 1);
  BIT a(n);
  for (int i = 0; i < n; i++) a.upd(i + 1, 1);
  int l, r;
  char c;
  for (int i = 0; i < m; i++) {
    cin >> l >> r >> c;
    int L = a.search(l);
    int R = a.search(r);
    auto it = I[c].lower_bound(L);
    if (it != I[c].end() && *it < L) it++;
    while (it != I[c].end() && *it <= R) {
      int x = *it;
      a.upd(x, -1);
      I[c].erase(it);
      it = I[c].lower_bound(x);
    }
  }
  string ans = "";
  for (int i = 0; i < n; i++)
    if (I[s[i]].find(i + 1) != I[s[i]].end()) ans += s[i];
  cout << ans << '\n';
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  solve();
  return 0;
}
