rt
#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int mod=998244353;
const int maxn=5e5+15;
int n,m;
int x[maxn];
struct line
{
int l,r,h;
}xd[maxn];
bool cmp(line a,line b)
{
return a.h>b.h;
}
struct node
{
int l,r;
int sum,tag;
}tr[maxn<<2];
int ls(int p)
{
return p<<1;
}
int rs(int p)
{
return p<<1|1;
}
void pushup(int p)
{
tr[p].sum=tr[ls(p)].sum%mod+tr[rs(p)].sum%mod;
tr[p].sum%=mod;
}
void pushdown(int p)
{
if(tr[p].tag)
{
tr[ls(p)].sum=tr[rs(p)].sum=0;
tr[ls(p)].tag=tr[rs(p)].tag=1;
tr[p].tag=0;
}
}
void build(int p,int l,int r)
{
tr[p].l=l,tr[p].r=r;
if(l==r)
{
tr[p].sum=0;
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void add(int p,int x,int k)
{
if(tr[p].l==x&&tr[p].r==x)
{
tr[p].sum+=(k%mod);
tr[p].sum%=mod;
return;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(mid>=x) add(ls(p),x,k);
else add(rs(p),x,k);
pushup(p);
}
void update(int p,int l,int r)
{
if(l<=tr[p].l&&tr[p].r<=r)
{
tr[p].sum=0;
tr[p].tag=1;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(mid>=l) update(ls(p),l,r);
if(r>mid) update(rs(p),l,r);
pushup(p);
}
int query(int p,int l,int r)
{
if(l<=tr[p].l&&tr[p].r<=r) return tr[p].sum%mod;
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
int sum=0;
if(mid>=l) sum+=query(ls(p),l,r)%mod,sum%=mod;
if(mid<r) sum+=query(rs(p),l,r)%mod,sum%=mod;
return sum%mod;
}
void test()
{
cout<<"#"<<1<<endl;
}
void print(node x)
{
cout<<x.l<<" "<<x.r<<" "<<x.sum<<" "<<x.tag<<endl;
}
int maxp=-1;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
cin>>n>>m;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&xd[i].l,&xd[i].r,&xd[i].h);
xd[i].l++,xd[i].r++;
maxp=max(maxp,xd[i].r);
}
sort(xd+1,xd+n+1,cmp);
build(1,1,maxp);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x[i]);
x[i]++;
add(1,x[i],1);
}
for(int i=1;i<=m;i++)
{
int num=query(1,xd[i].l,xd[i].r)%mod;
update(1,xd[i].l,xd[i].r);
add(1,xd[i].l,num),add(1,xd[i].r,num);
}
printf("%lld\n",query(1,1,maxp)%mod);
return 0;
}