#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int r;
int c;
int v;
}SPNode;
typedef struct
{
int mu,nu,tu;
SPNode data[7001];
}SPMatrix;
int num[10001],rpot[10001];
SPMatrix *A,*B,*C;
void num_rpot()
{
int i,j;
for(i=0;i<(B->mu);i++)
num[i]=0;
for(i=1;i<=(B->tu);i++)
{
j=B->data[i].r;
num[j]++;
}
rpot[0]=1;
for(i=1;i<(B->mu);i++)
rpot[i]=rpot[i-1]+num[i-1];
}
int main()
{ // freopen("1.txt","r",stdin);
A=(SPMatrix *)malloc(sizeof(SPMatrix));
B=(SPMatrix *)malloc(sizeof(SPMatrix));
C=(SPMatrix *)malloc(sizeof(SPMatrix));
int i,k;
scanf("%d%d%d",&A->mu,&A->nu,&A->tu);
for(i=1;i<=(A->tu);i++)
scanf("%d%d%d",&A->data[i].r,&A->data[i].c,&A->data[i].v);
scanf("%d%d%d",&B->mu,&B->nu,&B->tu);
for(i=1;i<=(B->tu);i++)
scanf("%d%d%d",&B->data[i].r,&B->data[i].c,&B->data[i].v);
C->mu=A->mu;
C->nu=B->nu;
if(A->nu!=B->mu)
return 0;
else if(A->tu*B->tu==0)
printf("%d %d 0\n",C->mu,C->nu);
else
{
num_rpot();
int temp[10001];
int j,r,q,p,t;
p=1; //指示A.data中当前非零元素的位置
r=0; //计数C中非零元素的个数
for(i=0;i<(A->mu);i++)
{
for(j=0;j<(B->nu);j++)
temp[j]=0; //Cij的累加器的初始化
while(A->data[p].r==i) //求第i行的
{
k=A->data[p].c; //A中当前非零元素的列号
if(k<(B->mu)-1) //确定B.data中第k行最后一个非零元素的位置
t=rpot[k+1]-1;
else
t=(B->tu);
for(q=rpot[k];q<=t;q++) //B中第k行的每一个非零元素
{
j=B->data[q].c;
temp[j]=temp[j]+(A->data[p].v)*(B->data[q].v);
}
p++;
}//while
for(k=0;k<(B->nu);k++)
if(temp[k])
{
r++;
C->data[r].r=i;
C->data[r].c=k;
C->data[r].v=temp[k];
}
}//for
C->tu=r;
printf("%d %d %d\n",C->mu,C->nu,C->tu);
if(C->tu>=1)
for(i=1;i<=r;i++)
printf("%d %d %d\n",C->data[i].r,C->data[i].c,C->data[i].v);
}
return 0;
}