#if defined(_USE_PCH_)
#include "pch.hpp"
#else
#include <bits/stdc++.h>
#endif
#define RNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_<=V_##_END; V_++)
#define IRNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_>=V_##_END; V_--)
#ifdef _WIN32
#define long int64_t
#endif
#define fir first
#define sec second
#define _UN using namespace
using namespace std;
typedef pair<int,int> pii;
typedef __int128 i128;
const int MAXN=1e6+10; const long INFL=0x3f3f3f3f3f3f3f3f,NINFL=0xc0c0c0c0c0c0c0c0;
int n,m,testid; i128 ans;
struct _At{ int p; long v,c; } A[MAXN];
struct _Bt{ int l,r; long c; } B[MAXN];
long S[MAXN],C1[MAXN],C2[MAXN];
struct SGT1{
#define ls (u<<1)
#define rs (u<<1|1)
    static const int MAXN=1<<21;
    long mn[MAXN],tag[MAXN]; pair<long,int> mn2[MAXN]; int len;
    pair<long,int> add(pair<long,int> x,long a){ return {x.fir+a,x.sec}; }
    void pushup(int u){
        mn[u]=min(mn[ls]+tag[ls],mn[rs]+tag[rs]);
        mn2[u]=min(add(mn2[ls],tag[ls]),add(mn2[rs],tag[rs]));
    }
    void init(){
        for(len=1; len<(m+2); len*=2); 
        fill_n(mn,len*2,0),fill_n(tag,len*2,0);
        RNG(i,0,len-1) mn2[i+len]={0,-i};
        IRNG(u,len-1,1) pushup(u);
    }
    void upd(int l,int r,long x){
        int u=len+l-1,v=len+r+1;
        for(; u^v^1; u>>=1,v>>=1,pushup(u),pushup(v)){
            if(~u&1) tag[u^1]+=x;
            if( v&1) tag[v^1]+=x;
        }
        for(; u; u>>=1) pushup(u);
    }
    long qry(int l,int r){
        long retl=INFL,retr=INFL;
        int u=len+l-1,v=len+r+1;
        for(; u^v^1; u>>=1,v>>=1,retl+=tag[u],retr+=tag[v]){
            if(~u&1) retl=min(retl,mn[u^1]+tag[u^1]);
            if( v&1) retr=min(retr,mn[v^1]+tag[v^1]);
        }
        retl=min(retl,retr);
        for(u>>=1; u; u>>=1) retl+=tag[u];
        return retl;
    }
    pair<long,int> qry2(int l,int r){
        pair<long,int> retl={INFL,0},retr={INFL,0};
        int u=len+l-1,v=len+r+1;
        for(; u^v^1; u>>=1,v>>=1,retl=add(retl,tag[u]),retr=add(retr,tag[v])){
            if(~u&1) retl=min(retl,add(mn2[u^1],tag[u^1]));
            if( v&1) retr=min(retr,add(mn2[v^1],tag[v^1]));
        }
        retl=min(retl,retr);
        for(u>>=1; u; u>>=1) retl=add(retl,tag[u]);
        return retl;
    }
    int find(int r){
        auto x=qry2(1,r);
        assert(x.fir==0);
        return -x.sec;
    }
#undef ls
#undef rs
} sgt1;
struct SGT2{
#define ls (u<<1)
#define rs (u<<1|1)
    static const int MAXN=1<<21;
    int len; pair<long,int> mn[MAXN];
    void init(){
        for(len=1; len<(n+2); len*=2); 
        fill_n(mn,len*2,{INFL,0});
    }
    void upd(int i,long x){
        int u=i+len; mn[u]={C1[i]?A[i].v:INFL,i};
        for(u>>=1; u; u>>=1) mn[u]=min(mn[ls],mn[rs]);
    }
    pair<long,int> qry(int l,int r){
        pair<long,int> ret{INFL,0};
        for(int u=len+l-1,v=len+r+1; u^v^1; u>>=1,v>>=1){
            if(~u&1) ret=min(ret,mn[u^1]);
            if( v&1) ret=min(ret,mn[v^1]);
        }
        return ret;
    }
#undef ls
#undef rs
} sgt2;
struct SGT3{
#define ls (u<<1)
#define rs (u<<1|1)
    static const int MAXN=1<<21;
    int len; long mn[MAXN],tag[MAXN];
    void pushup(int u){ mn[u]=min(mn[ls]+tag[ls],mn[rs]+tag[rs]); }
    void init(){
        for(len=1; len<(m+2); len*=2); 
        fill_n(mn,len*2,0),fill_n(tag,len*2,0);
    }
    void upd(int l,int r){
        int u=len+l-1,v=len+r+1;
        for(; u^v^1; u>>=1,v>>=1,pushup(u),pushup(v)){
            if(~u&1) tag[u^1]+=x;
            if( v&1) tag[v^1]+=x;
        }
        for(; u; u>>=1) pushup(u);
    }
    long qry(int i){
        int u=len+i;
        auto ret=mn[u];
        for(; u; u>>=1) ret+=tag[u];
        return tag;
    }
    int find(long x){
        int u=1;
        while(u<len){
            x-=tag[u];
            if(mn[rs]+tag[rs]>=x) u=rs;
            else u=ls;
        }
        return u-len;
    }
#undef ls
#undef rs
} sgt3;
struct BIT{
    long A[MAXN];
    void init(){ fill_n(A+1,n,0); }
    void upd(int i,long x){
        for(; i<=n; i+=i&-i) A[i]+=x;
    }
    void upd(int l,int r,int x){ upd(l,x),upd(r+1,-x); }
    long qry(int i){
        if(!i) return 0;
        long ret=0;
        for(; i; i-=i&-i) ret+=A[i];
        return ret;
    }
} bit1;
ostream& operator<<(ostream& os,i128 x){
    if(!x){ return os<<'0'; }
    if(x<0) os<<'-',x=-x;
    char buf[50]; int i=0;
    while(x) buf[i++]=char(x%10+'0'),x/=10;
    buf[i]=0;
    reverse(buf,buf+i);
    return os<<buf;
}
void case_main(){
    cin>>n>>m;
    RNG(i,1,n) cin>>A[i].p>>A[i].v>>A[i].c,S[i]=S[i-1]+A[i].c;
    RNG(i,1,m) cin>>B[i].l>>B[i].r>>B[i].c;
    sort(A+1,A+n+1,[](auto x,auto y){ return x.p<y.p; });
    sort(B+1,B+m+1,[](auto x,auto y){ return x.l!=y.l?x.l<y.l:x.r<y.r; });
    sgt1.init(),bit1.init();
    RNG(i,1,m) C1[i]=B[i].c;
    auto fd1=[](int i)->pii{
        int l2=1,r2=m,p1=0;
        while(l2<=r2){
            auto mid=(l2+r2)/2;
            if(B[mid].r>=i) p1=mid,r2=mid-1;
            else l2=mid+1;
        }
        l2=1,r2=m; int p2=0;
        while(l2<=r2){
            auto mid=(l2+r2)/2;
            if(B[mid].l<=i) p2=mid,l2=mid+1;
            else r2=mid-1;
        }
        if(p1&&p2&&B[p1].l<=i&&i<=B[p1].r&&B[p2].l<=i&&i<=B[p2].r) return {p1,p2};
        return {0,0};
    };
    ans=0;
    long cur=0;
    RNG(i,1,n,j=1){
        auto [l,r]=fd1(A[i].p);
        if(!l||l>r) continue;
        while(j<l) sgt3.upd(j,j,cur),j++;
        while(C2[i]<A[i].c){
            if(j>r){
                assert(j==r+1);
                int p=sgt1.find(r);
                int x=bit.qry(p);
                int y=lower_bound(S+1,S+n+1,x)-S;
                if(S[y-1]+C2[y]<=x) y++;
                assert(y<=i);
                int k=sgt2.qry(y,i).sec;
                if(A[k].v>=A[i].v) break;
                int q=sgt3.find(y);
                auto z=min({S[y-1]+C2[y]-x,C2[y],sgt1.qry(p+1,r)});
                assert(z);
                ans+=(A[i].v-A[k].v)*z;
                cur+=z;
                C2[y]-=z,C2[i]+=z;
                if(k<r) sgt1.upd(k+1,r,-z);
                if(l<r) sgt1.upd(l+1,r,z);
                sgt2.upd(y),sgt2.upd(i);
            }else{
                auto y=min(A[i].c-C2[i],C1[j]);
                ans+=A[i].v*y;
                cur+=y;
                C1[j]-=y,C2[i]+=y;
                if(l<j) sgt1.upd(l+1,j,y);
                sgt2.upd(i);
                if(!C1[j]) sgt3.upd(j,j,cur),j++;
            }
        }
    }
    cout<<ans<<"\n";
}
int main(){
#if defined(_LOCAL_)
    freopen("in","r",stdin);
    freopen("out","w",stdout);
//  freopen("/dev/null","w",stderr);
#else
//  freopen("k.in","r",stdin);
//  freopen("k.out","w",stdout);
#endif
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int cas; cin>>testid>>cas;
    RNG(_,1,cas) case_main();
}