#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,INF=1e9;
int n,m,a[N][N];
int g[N][N],dp[N][N];//dp[i][j] 记录在(i,j)位置的最大money
//g[i][j] 记录在第几个回合(i,j)位置会变成墙体
void solve(){
//由于只能向下和向右移动,所以走到点(i,j) 需要步数易推知为 (i-1)+(j-1)=i+j-2
//所需步数+1<=g[i][j] 即走到(i,j)时的步数+1不能超过墙体产生的回合数
//dp[i][j]=dp[i-1][j]+dp[i][j-1]+a[i][j]
dp[1][1]=a[1][1]; //题目表明(1,1)必定能走通
int max_money=a[1][1]; //默认开始拿到的金币最多 后续再修改
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==1&&j==1) continue;
//(i+j-2)即到达(i,j)的所需步数 +1则参考上面注释
if((i+j-2)+1<=g[i][j]){
if(dp[i-1][j]==0&&dp[i][j-1]==0) continue;//其实就表示dp[i][j]无法到达因为无论从它的上面和左边都没有路径
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];
max_money=max(max_money,dp[i][j]);//顺便求一下最大金币,因为dp仅在此if中发生了修改,所以直接求dp修改后的最大值即可
}
}
}
cout<<max_money<<endl;
return;
}
//看懂的以后能拿金牌的大佬能否点个小赞(【鲜花】【鲜花】)
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int t,x,y,v;
cin>>t;
memset(g,0x3f,sizeof(g)); //默认永不建墙
for(int i=1;i<=t;i++){
cin>>x>>y>>v;
g[x][y]=v; //在第v回合在(x,y)建立墙体
}
solve(); //调用解决问题函数,以防主函数太臃肿,能更好梳理解决思路
return 0;
}