#include <bits/stdc++.h>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/assoc_container.hpp>
#define ll long long
#define ld long double
#define llinf 100000000000000000LL
#define pb push_back
#define popb pop_back
#define fi first
#define sc second
#define pll pair<ll,ll>
#define endl '\n'
#define all(a) a.begin(),a.end()
#define sz(x) (int)x.size()
#define ios ios::sync_with_stdio(0); cout.tie(0); cin.tie(0);
//using namespace __gnu_pbds;
using namespace std;
//template<class T> using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
const int MOD=1000000007;
const int mxN=5e4+5;
ll a[mxN],b[mxN],c[mxN],d[mxN],ukkolone[mxN],ukredovi[mxN];
void solve(){
	ll n, m;
	cin >> n >> m;
	for(int i=1;i<=n;i++){
		cin >> a[i] >> b[i];
	}
	for(int i=1;i<=m;i++){
		cin >> c[i] >> d[i];
	}
    ll ans=0,k=0;
    vector<pair<ll,ll>> poz;
    vector<ll> kolko;
    int i=1,j=1;
    poz.pb({i,j});
    kolko.pb(min(b[1],d[1]));
    if(min(b[1],d[1])!=0){
        ans+=min(b[1],d[1]);
        k++;
    }
    ukkolone[1]+=min(b[1],d[1]);
    ukredovi[1]+=min[b[1],d[1]);
    if(min(b[1],d[1])==b[1]&&min(b[1],d[1])==d[1]){
        i++;
        j++;
        b[1]=0;
        d[1]=0;
    }
    else if(min(b[1],d[1])==b[1]){
        j++;
        b[1]=0;
        d[1]-=b[1];
    }
    else{
        i++;
        d[1]=0;
        b[1]-=d[1];
    }
    while(i<=n&&j<=m){
        int x=min(b[i],d[j]);
        if(i!=n&&j!=m){
            ans+=x;
            k++;
            kolko.pb(x);
            poz.pb({i,j});
            ukkolone[i]+=x;
            ukredovi[j]+=x;
            if(x==b[i]&&x==d[j]){
                i++;
                j++;
                b[i]=0;
                d[j]=0;
            }
            else if(x==b[i]){
                j++;
                b[i]=0;
                d[j]-=b[i];
            }
            else{
                i++;
                d[j]=0;
                b[i]-=d[j];
            }
        }
        else{
            break;
        }
    }
    vector<ll> poslednja_kolona(m);
    vector<ll> poslednji_red(n);
    ll preostalo_kolona=b[n],preostalo_red=d[n];
    for(int i=1;i<=m;i++){
        poslednja_kolona[i]=d[i]-max(0,c[i]-ukkolone[i]);
        d[i]-=max(0,c[i]-ukkolone[i]);
        preostalo_kolona-=poslednja_kolona[i];
    }
    if(preostalo_kolona>0){
        int in=1;
        while(preostalo_kolona>0&&in<=m){
            poslednja_kolona[in]+=min(preostalo_kolona-d[i],preostalo_kolona);
            in++;
        }
    }
    for(int i=1;i<=m;i++){
        if(poslednja_kolona[i]!=0){
            poz.pb({n,i});
            kolko.pb(poslednja_kolona[i]);
        }
    }
    for(int i=1;i<=n;i++){
        poslednji_red[i]=b[i]-max(0,a[i]-ukredovi[i]);
        b[i]-=max(0,a[i]-ukredovi[i]);
        preostalo_red-=poslednji_red[i];
    }
    if(preostalo_red>0){
        while(preostalo_red>0){
            poslednji_red[in]+=min(preostalo_red-b[i],preostalo_red);
            in++;
        }
    }
    for(int i=1;i<=n;i++){
        if(poslednji_red[i]!=0){
            poz.pb({i,m});
            kolko.pb(poslednji_red[i]);
        }
    }
    cout << ans << endl;
    cout << k << endl;
    for(int i=0;i<sz(kolko);i++){
        cout << poz[i].fi << ' ' << poz[i].sc << ' ' << kolko[i] << endl;
    }
}

int main(){
    ios;
	int t=1;
	//cin >> t;
	while(t--){
       solve();
	}
    return 0;
}