#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Triple
{
    int i;
    int j;
    int e;
}Triple;
typedef struct _Matrix
{
    Triple* data;
    int* i_pos;
    int m, n, size, max_size;
}Matrix;
void Increase(Matrix* M, int n)//可以增加容纳二元组的个数
{
    int ret = 0;
    Triple* t = (Triple*)calloc(ret = M->max_size + n, sizeof(Triple));
    for (int i = 0; i < M->size; i++)
    {
        t[i] = M->data[i];
    }
    free(M->data);
    M->data = t;
    M->max_size = ret;
}
Matrix* Creat(int m, int n)
{
    Matrix* M = (Matrix*)malloc(sizeof(Matrix));
    M->m = m;
    M->n = n;
    M->size = 0;
    M->data = (Triple*)calloc(m * n / 5 + 1, sizeof(Triple));
    M->max_size = m * n / 5 + 1;
    M->i_pos = (int*)calloc(m, sizeof(int));
    return M;
}
void Destroy(Matrix* M)
{
    free(M->data);
    free(M->i_pos);
    free(M);
}
void Insert(Matrix* M, int m, int n, int e)
{
    if (M->size == M->max_size)
        Increase(M, 10);
    int t = M->size;
    M->data[t].e = e;
    M->data[t].i = m;
    M->data[t].j = n;
    (M->size)++;
}
void Print(Matrix* M)
{
    for (int i = 0; i < M->size; i++)
    {
        printf("%d %d %d\n", M->data[i].i, M->data[i].j, M->data[i].e);
    }
}
int Compare(Matrix* A, Matrix* B, int pa, int pb)
{
    if (A->data[pa].i > B->data[pb].i)
        return 1;
    else if (A->data[pa].i < B->data[pb].i)
        return -1;
    else
    {
        if (A->data[pa].j > B->data[pb].j)
            return 1;
        else if (A->data[pa].j < B->data[pb].j)
            return -1;
        else
            return 0;
    }
}
void Add(Matrix* A, Matrix* B, Matrix* C)
{
    int pa = 0, pb = 0;
    while (pa < A->size && pb < B->size)
    {
        if (Compare(A, B, pa, pb) == 0)
        {
            int tmp = A->data[pa].e + B->data[pb].e;
            if(tmp)
                Insert(C, A->data[pa].i, A->data[pa].j, tmp);//一定要注意判定是不是为  0
            pa++;
            pb++;
        }
        else if (Compare(A, B, pa, pb) < 0)
        {
            Insert(C, A->data[pa].i, A->data[pa].j, A->data[pa].e);
            pa++;
        }
        else
        {
            Insert(C, B->data[pb].i, B->data[pb].j, B->data[pb].e);
            pb++;
        }
    }
    while (pb < B->size)//别忘记
    {
        Insert(C, B->data[pb].i, B->data[pb].j, B->data[pb].e);
        pb++;
    }
    while (pa < A->size)
    {
        Insert(C, A->data[pa].i, A->data[pa].j, A->data[pa].e);
        pa++;
    }

}
int main()
{
    Matrix* A, * B, * C;
    A = Creat(2, 2);
    B = Creat(2, 2);
    C = Creat(2, 2);
    int a_num, b_num;
    scanf("%d%d", &a_num, &b_num);
    for (int i = 0; i < a_num; i++)
    {
        int _i, _j, _e;
        scanf("%d%d%d", &_i, &_j, &_e);
        Insert(A, _i, _j, _e);
    }
    for (int i = 0; i < b_num; i++)
    {
        int _i, _j, _e;
        scanf("%d%d%d", &_i, &_j, &_e);
        Insert(B, _i, _j, _e);
    }
    Add(A, B, C);
    Print(C);
    Destroy(A);
    Destroy(B);
    Destroy(C);
    return 0;
}