#5 RE ,不知道哪错了,求助QAQ
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define cclose ios::sync_with_stdio(false),cin.tie(0)
#define edg(i,v,u) for(int i=head[u],v=e[i].to;i;i=e[i].nxt,v=e[i].to)
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
return x*f;
}
template < class T >
void ckmax(T &x,T y){x=max(x,y);}
template < class T >
void ckmin(T &x,T y){x=min(x,y);}
typedef pair < int , int > pii ;
const int N(1e5+1e4);
int n,q;
int a[N];
char s[N];
char res[N];
struct Tree{int l,r,lzy,val;};
struct SGT{
Tree t[31][N<<2];
#define mid ((l+r)>>1)
#define lsn p<<1,l,mid
#define rsn p<<1|1,mid+1,r
inline void build(int p,int l,int r){
rep(c,1,26)t[c][p].l=l,t[c][p].r=r;
if(l==r)return (void)(t[s[l]-'a'+1][p].val=1);
build(lsn),build(rsn);
rep(c,1,26)t[c][p].val=t[c][p<<1].val+t[c][p<<1|1].val;
}
inline void cover(int p,int c,int v){
if(v==-1)t[c][p].val=0;
else t[c][p].val+=t[c][p].r-t[c][p].l+1;
t[c][p].lzy=v;
}
inline void push_down(int p,int c){
if(!t[c][p].lzy)return;
rep(P,p<<1,p<<1|1)cover(P,c,t[c][p].lzy);
t[c][p].lzy=0;
}
inline void upd(int p,int l,int r,int ql,int qr,int c,int v){
if(ql>qr)return;
if(ql<=l&&qr>=r)return cover(p,c,v);
push_down(p,c);
if(ql<=mid)upd(lsn,ql,qr,c,v);
if(qr>mid) upd(rsn,ql,qr,c,v);
t[c][p].val=t[c][p<<1].val+t[c][p<<1|1].val;
}
inline int qry(int p,int l,int r,int ql,int qr,int c){
if(ql<=l&&qr>=r)return t[c][p].val;
push_down(p,c); int ret=0;
if(ql<=mid)ret+=qry(lsn,ql,qr,c);
if(qr>mid) ret+=qry(rsn,ql,qr,c);
return ret;
}
inline void print(int p,int l,int r){
if(l==r){
rep(c,1,26)if(t[c][p].val){
res[l]='a'+c-1; break;
} return;
}
rep(c,1,26)push_down(p,c);
print(lsn),print(rsn);
}
}T;
int main(){
cclose,cin>>n>>q>>(s+1);
T.build(1,1,n);
rep(i,1,q){
int l,r,op;
cin>>l>>r>>op;
int now=l;
for(int c=(op?1:26);(op?(c<=26):(c>=1));(op?c++:c--)){
int cnt=T.qry(1,1,n,l,r,c);
if(!cnt)continue;
T.upd(1,1,n,l,r,c,-1);
T.upd(1,1,n,now,now+cnt-1,c,1);
now+=cnt;
}
} T.print(1,1,n);
rep(i,1,n)putchar(res[i]);
return 0;
}