#include <stdio.h>
#include <vector>
#include <utility>
#include <stdlib.h>

using namespace std;

#define par pair<pair<int,int>,int>
#define x first
#define y second

long long nmin[50010];
long long nmax[50010];
long long mmin[50010];
long long mmax[50010];



int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int t=1;
    if (n!=m) t=0;
    int minN=0,minM=0,maxN=0,maxM=0;
    for (int i=0;i<n;i++)
    {
        scanf("%d%d",&nmin[i],&nmax[i]);
        minN+=nmin[i];
        maxN+=nmax[i];
    }
    for (int i=0;i<m;i++)
    {
        scanf("%d%d",&mmin[i],&mmax[i]);
        if (nmin[i]<mmin[i] && mmin[i]<nmax[i] && nmax[i]<mmax[i]) t=1;
        else t=0;
        minM+=mmin[i];
        maxM+=mmax[i];
    }


    //printf("minN=%d maxN=%d minM=%d maxM=%d",minN,maxN,minM,maxM);
    vector <par> v;
    int i=0,j=0;
    long long res=0;
    if (n==1)
    {
        int *pom=(int*)calloc(m+10,sizeof(int));
        int br=0;
        for (int i=0;i<m;i++)
        {
            pom[i]=mmin[i];
            mmax[i]-=mmin[i];
            nmax[0]-=pom[i];
        }
        for (int i=0;i<m;i++)
        {
            if (mmax[i]<nmax[0])
            {
                pom[i]+=mmax[i];
                nmax[0]-=mmax[i];
            }
            else
            {
                pom[i]+=nmax[0];
                break;
            }
        }
        for (int i=0;i<m;i++)
        {
            res+=pom[i];
            if (pom[i]) br++;
        }
        printf("%d\n",res);
        printf("%d\n",br);
        for (int i=0;i<m;i++)
        {
            if (pom[i]) printf("1 %d %d\n",i+1,pom[i]);
        }
        return 0;
    }

    if (t)
    {
        for (int i=0;i<n;i++)
        {
            if (nmax[i]) v.push_back(make_pair( make_pair(i+1,i+1), nmax[i] ) );
            res+=nmax[i];
        }
        printf("%lld\n%d\n",res,v.size());
        for (int i=0;i<v.size();i++) printf("%d %d %d\n",v[i].x.x,v[i].x.y,v[i].y);
        return 0;
    }

    while (i<n && j<m)
    {
        long long maximumi=min(nmax[i],mmax[j]);
        long long d1=maxN-(minM-mmin[j]);
        long long d2=maxM-(minN-nmin[i]);
        long long d=min(d1,d2);
        long long tren=min(maximumi,d);
        printf("i=%d j=%d tren=%d    nmax=%d, mmax=%d, d1=%d, d2=%d\n",i,j,tren,nmax[i],mmax[j],d1,d2);
        par p= make_pair( make_pair(i,j), tren );
        if (tren==0)
        {
            i++;
            j++;
        }
        else
        {
            v.push_back(p);
            res+=tren;
            int ii=i,jj=j;
            if (nmax[i]==tren || d2==tren)
            {
                i++;
                maxN-=nmax[i];
                minN-=nmin[i];
                mmax[jj]-=tren;
                mmin[jj]-=tren;
                if (mmin[jj]<0) mmin[jj]=0;
            }
            if (mmax[j]==tren || d1==tren)
            {
                j++;
                maxM-=mmax[j];
                minM-=mmin[j];
                nmax[ii]-=tren;
                nmin[ii]-=tren;
                if (nmin[ii]<0) nmin[ii]=0;
            }

        }
    }
    printf("\n\n%lld\n", res);
    printf("%d\n",v.size());
    for (int i=0;i<v.size();i++)
    {
        printf("%d %d %lld\n",v[i].x.x+1,v[i].x.y+1,v[i].y);
    }
}