#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;
}