#include<iostream>
#include<algorithm>
using namespace std;
int n,m,T;
struct spot{
int x,y;
};
int colored=0;
struct edge{
spot u,v;
int w;
}ed[10000010];
int get_;
int k;
int sp[2000][2000];
long long min_(long long a,long long b){
if(a<=b){
return a;
}else{
return b;
}
}
bool cmp(edge a,edge b){
return a.w>b.w;
}
int main(){
freopen("traffic2.in","r",stdin);
freopen("traffic.out","w",stdout);
cin>>n>>m>>T;
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m;j++){
spot u,v;
u.x=i;
u.y=j;
sp[i][j]=-1;
v.x=i+1;
v.y=j;
sp[i+1][j]=-1;
ed[++get_].u=u;
ed[get_].v=v;
cin>>ed[get_].w;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m-1;j++){
spot u,v;
u.x=i;
u.y=j;
sp[i][j]=-1;
v.x=i;
v.y=j+1;
sp[i][j+1]=-1;
ed[++get_].u=u;
ed[get_].v=v;
cin>>ed[get_].w;
}
}
int ori_get_=get_;
while(T--){
colored=0;
get_=ori_get_;
cin>>k;
int x3,p,t;
for(int i=1;i<=k;i++){
cin>>x3>>p>>t;
if(p<=m){
spot u,v;
u.x=0;
u.y=p;
sp[0][p]=t;
v.x=1;
v.y=p;
sp[1][p]=-1;
ed[++get_].u=u;
ed[get_].v=v;
ed[get_].w=x3;
}else if(p>=m+1&&p<=m+n){
spot u,v;
u.x=(p-m);
u.y=m+1;
sp[p-m][m+1]=t;
v.x=(p-m);
v.y=m;
sp[p-m][m]=-1;
ed[++get_].u=u;
ed[get_].v=v;
ed[get_].w=x3;
}else if(p>=m+n+1&&p<=2*m+n){
spot u,v;
u.x=n+1;
u.y=(2*m+n-p+1);
sp[n+1][2*m+n-p+1]=t;
v.x=n;
v.y=(2*m+n-p+1);
sp[n][2*m+n-p+1]=-1;
ed[++get_].u=u;
ed[get_].v=v;
ed[get_].w=x3;
}else if(p>=2*m+n+1&&p<=2*m+2*n){
spot u,v;
u.x=(2*m+2*n+1-p);
u.y=0;
sp[2*m+2*n+1-p][0]=t;
v.x=(2*m+2*n+1-p);
v.y=1;
sp[2*m+2*n+1-p][1]=-1;
ed[++get_].u=u;
ed[get_].v=v;
ed[get_].w=x3;
}
}
sort(ed+1,ed+get_+1,cmp);
int poi=0;
bool flag=false;
while(colored<n*m){
++poi;
spot u=ed[poi].u;
spot v=ed[poi].v;
if(sp[u.x][u.y]!=-1&&sp[v.x][v.y]==-1){
sp[v.x][v.y]=sp[u.x][u.y];
colored++;
}else if(sp[u.x][u.y]==-1&&sp[v.x][v.y]!=-1){
sp[u.x][u.y]=sp[v.x][v.y];
colored++;
}else if(sp[u.x][u.y]==-1&&sp[v.x][v.y]==-1){
flag=true;
sp[u.x][u.y]=-2;
sp[v.x][v.y]=-2;
colored+=2;
}
}
long long ans=0;
if(flag==false){
for(int i=1;i<=get_;i++){
spot u=ed[i].u;
spot v=ed[i].v;
if(sp[u.x][u.y]!=sp[v.x][v.y]){
ans+=ed[i].w;
}
}
cout<<ans<<endl;
continue;
}else{
long long ans1=0,ans2=0;
for(int i=1;i<=get_;i++){
spot u=ed[i].u;
spot v=ed[i].v;
if(sp[u.x][u.y]!=sp[v.x][v.y]&&(sp[u.x][u.y]==0||sp[v.x][v.y]==0)){
ans1+=ed[i].w;
}
}
for(int i=1;i<=get_;i++){
spot u=ed[i].u;
spot v=ed[i].v;
if(sp[u.x][u.y]!=sp[v.x][v.y]&&(sp[u.x][u.y]==1||sp[v.x][v.y]==1)){
ans2+=ed[i].w;
}
}
ans=min_(ans1,ans2);
}
cout<<ans<<endl;
continue;
}
return 0;
}