#include<bits/stdc++.h>
#define ll long long
#define vt vector
#define nl '\n'
#define sp ' '

using namespace std;

const int mxN = 50010;

map<pair<int,int>,int> M;
vt<pair<int,int>> ans;

int A[mxN][2], B[mxN][2];

ll sum = 0;

// i - red
// j - col
// k1,k2 - odakle
void spoj(int i, int j, int k1, int k2){
    int mn = min(A[i][k1], B[j][k2]);
    A[i][k1] -= mn;
    B[j][k2] -= mn;
    sum += mn;
    M[{i,j}] += mn;
    if(M[{i,j}] == mn) ans.push_back({i,j});
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n,m; cin>>n>>m;
    for(int i = 0; i < n; ++i){
        cin >> A[i][0] >> A[i][1];
        A[i][1] -= A[i][0];
    }
    for(int i = 0; i < m; ++i){
        cin >> B[i][0] >> B[i][1];
        B[i][1] -= B[i][0];
    }
    for(int k = 0; k <= 1; ++k){
        int i = 0;
        for(int j = 0; j < m; ++j){
            while(i < n && A[i][k] == 0) ++i;
            while(B[j][0] && i < n){
                spoj(i,j,k,0);
                while(i < n && A[i][k] == 0) ++i;
            }
        }

    }
    for(int k = 0; k <= 1; ++k){
        int j = 0;
        for(int i = 0; i < n; ++i){
            while(j < m && B[j][k] == 0) ++j;
            while(A[i][0] && j < m){
                spoj(i,j,0,k);
                while(j < m && B[j][k] == 0) ++j;
            }
        }
    }

    int i = 0;
    for(int j = 0; j < m; ++j){
        while(i < n && A[i][1] == 0) ++i;
        while(i < n && B[j][1]){
            spoj(i,j,1,1);
            while(i < n && A[i][1] == 0) ++i;
        }
    }

    cout << sum << nl;

    cout << ans.size() << nl;
    for(const auto & p : ans){
        cout<< p.first + 1 << sp << p.second + 1 << sp << M[p] << nl;
    }

    return 0;
}