// #include<bits/stdc++.h> // using namespace std; // #define int long long // int n,m; // int w[1010][1010]; // int st[1010][1010]; // int f[1010][1010]; // int T; // int ans=INT_MIN; // int dfs(int i,int j) // { // if(i>n||j>m)return 0; // if(st[i][j])return 0; // if(f[i][j])return f[i][j]; // f[i][j]=max(dfs(i,j+1),dfs(i+1,j))+w[i][j]; // ans=max(f[i][j],ans); // return f[i][j]; // } // void solve(){ // cin>>n>>m; // for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>w[i][j]; // cin>>T; // while(T--) // { // int a,b,c; // cin>>a>>b>>c; // if(a==1&&b==1)continue; // if(a+b-2>=c)st[a][b]=1; // } // dfs(1,1); // cout<<ans; // }

// signed main() { // ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); // int ; // =1; // //cin>>; // while(--)solve(); // }

#include<bits/stdc++.h> using namespace std; //#define int long long int n,m; int w[1010][1010]; int T; int st[1010][1010]; int f[1010][1010]; int xx[]={0,1}; int yy[]={1,0}; int ans; queue<pair<int,int> >q; void bfs() { q.push({1,1}); f[1][1]=w[1][1]; while(q.size()) { auto it=q.front(); q.pop(); int x=it.first; int y=it.second; ans=max(ans,f[x][y]); for(int i=0;i<2;i++) { int x1=x+xx[i]; int y1=y+yy[i]; if(x1>n||y1>m)continue; if(st[x1][y1])continue; if(f[x1][y1]>=f[x][y]+w[x1][y1])continue; f[x1][y1]=f[x][y]+w[x1][y1]; q.push({x1,y1}); } } }

void solve(){ cin>>n>>m; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>w[i][j]; cin>>T; while(T--) { int a,b,c; cin>>a>>b>>c; if(a==1&&b==1)continue; if(a+b-2>=c)st[a][b]=1; } bfs(); cout<<ans; }

signed main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int ; =1; //cin>>; while(--)solve(); }