const int MAXN=1e5+5,M=1e6,M2=1e6+5;
struct Line{
int y,a,b;
bool operator < (const Line &b)const{
return y<b.y;
}
}OX[MAXN],OY[MAXN<<1];
int lef[M2<<2],rig[M2<<2],s[M2<<2];
void build(int k,int L,int R){
lef[k]=L,rig[k]=R;
if(L==R)return;
int M=L+R>>1;
build(k<<1,L,M);build(k<<1|1,M+1,R);
}
void update(int k,int pos,int v){
s[k]+=v;
if(lef[k]==rig[k])return;
int mid=lef[k]+rig[k]>>1;
if(mid>=pos)update(k<<1,pos,v);
else update(k<<1|1,pos,v);
}
int query(int k,int L,int R){
if(L<=lef[k]&&rig[k]<=R)return s[k];
int ans=0,mid=lef[k]+rig[k]>>1;
if(mid>=L)ans+=query(k<<1,L,R);
if(mid<R)ans+=query(k<<1|1,L,R);
return ans;
}
int main()
{
int n=read_int(),m=read_int();
LL ans=1;
_for(i,0,n){
OX[i].y=read_int(),OX[i].a=read_int(),OX[i].b=read_int();
if(OX[i].b-OX[i].a==M)ans++;
}
_for(i,0,m){
OY[i].a=OY[i+m].a=read_int(),OY[i].y=read_int(),OY[i+m].y=read_int();
if(OY[i+m].y-OY[i].y==M)ans++;
OY[i].b=1,OY[i+m].b=-1,OY[i+m].y++;
}
m<<=1;
sort(OX,OX+n);sort(OY,OY+m);
build(1,0,M);
int pos=0;
_for(i,0,n){
while(pos<m&&OY[pos].y<=OX[i].y)
update(1,OY[pos].a,OY[pos].b),pos++;
ans+=query(1,OX[i].a,OX[i].b);
}
enter(ans);
return 0;
}