#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e5+1;
int n,q,root,tot;
vector<int>ans,tmp1,tmp2,tmp3;
string s;
struct SegmentTreeNode{
int l,r,ls,rs,tag;
vector<int>val;
SegmentTreeNode(int l=0,int r=0):l(l),r(r),ls(0),rs(0),val(vector<int>(26,0)),tag(-1){}
}f[N<<1];
void pushup(int cur){
for(int i=0;i<26;i++)
f[cur].val[i]=f[f[cur].ls].val[i]+f[f[cur].rs].val[i];
return;
}
SegmentTreeNode pushup(const SegmentTreeNode&a,const SegmentTreeNode&b){
SegmentTreeNode ret(a.l,b.r);
for(int i=0;i<26;i++)
ret.val[i]=a.val[i]+b.val[i];
return ret;
}
void pushdown(int cur){
if(f[cur].tag!=-1){
f[f[cur].ls].tag=f[f[cur].rs].tag=f[cur].tag;
f[f[cur].ls].val=f[f[cur].rs].val=vector<int>(26,0);
f[f[cur].ls].val[f[cur].tag]=f[f[cur].ls].r-f[f[cur].ls].l+1,
f[f[cur].rs].val[f[cur].tag]=f[f[cur].rs].r-f[f[cur].rs].l+1;
f[cur].tag=-1;
}
return;
}
void build(int l,int r,int&cur){
f[cur=(++tot)]=SegmentTreeNode(l,r);
if(l==r){
f[cur].val[s[l]-'a']=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,f[cur].ls),build(mid+1,r,f[cur].rs);
return pushup(cur);
}
void modify(int l,int r,int val,int cur){
if(l<=f[cur].l&&f[cur].r<=r){
f[cur].val=vector<int>(26,0);
f[cur].val[val]=(f[cur].r-f[cur].l+1);
f[cur].tag=val;
return;
}
pushdown(cur);
int mid=(f[cur].l+f[cur].r)>>1;
if(l<=mid)
modify(l,r,val,f[cur].ls);
if(mid<r)
modify(l,r,val,f[cur].rs);
return pushup(cur);
}
SegmentTreeNode query(int l,int r,int cur){
if(l<=f[cur].l&&f[cur].r<=r)
return f[cur];
pushdown(cur);
int mid=(f[cur].l+f[cur].r)>>1;
if(mid<l)
return query(l,r,f[cur].rs);
if(r<=mid)
return query(l,r,f[cur].ls);
return pushup(query(l,r,f[cur].ls),query(l,r,f[cur].rs));
}
void debug(){
for(int i=1;i<=n;i++){
ans=query(i,i,1).val;
for(int j=0;j<26;j++)
if(ans[j])
cerr<<(char)(j+'a');
}
cerr<<'\n';
return;
}
int main(){
cin>>n>>q>>s;
s=" "+s;
build(1,n,root);
for(int l,r,op;q;--q){
cin>>l>>r>>op;
vector<int>vals=query(l,r,1).val;
if(op) for(int i=0,lst=l;i<26;i++){
modify(lst,lst+vals[i]-1,i,1);
lst+=vals[i];
}
else for(int i=0,lst=r;i<26;i++){
modify(lst-vals[i]+1,lst,i,1);
lst-=vals[i];
}
}
for(int i=1;i<=n;i++){
ans=query(i,i,1).val;
for(int j=0;j<26;j++)
if(ans[j])
cout<<(char)(j+'a');
}
return 0;
}