#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Field {
private:
vector<int> age;
int feed;
int incFeed;
int deadLine;
public:
Field() {
feed = 5;
}
void plant(int _age) {
age.push_back(_age);
}
void setIncFeed(int _incFeed) {
incFeed = _incFeed;
}
void ageSort() {
sort(age.begin(), age.end());
}
void feedEat() {
deadLine = -1;
for (int i = 0; i < age.size(); i++) {
if (age[i] <= feed) {
feed -= age[i];
age[i]++;
}
else if(age[i] > feed) {
deadLine = i;
break;
}
}
}
void deadTree() {
if (deadLine != -1) {
int loop = age.size() - deadLine;
for (int i = deadLine; i < age.size(); i++) {
feed += age[i] / 2;
age.erase(age.begin() + deadLine);
i--;
}
}
}
bool isExistTree() {
if (age.size() <= 0) {
return false;
}
return true;
}
int breedTreeNum() {
int cnt = 0;
for (int i = 0; i < age.size(); i++) {
if (age[i] % 5 == 0) {
cnt++;
}
}
return cnt;
}
void addFeed() {
feed = feed + incFeed;
}
int getTreeNum() {
return age.size();
}
void printInfo() {
cout << "<" << feed << "," << incFeed << ">";
cout << "{" << getTreeNum() << "}";
cout << "(";
for (int i = 0; i < age.size(); i++) {
cout << age[i] << ",";
}
cout << ")";
cout << "";
}
};
int main(void) {
int N;
int M;
int K;
cin >> N;
cin >> M;
cin >> K;
Field **fields = new Field*[N];
for (int i = 0; i < N; i++) {
fields[i] = new Field[N];
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int _incFeed;
cin >> _incFeed;
fields[j][i].setIncFeed(_incFeed);
}
}
vector<pair<int, int> > treeLoc;
for (int i = 0; i < M; i++) {
int x, y, z;
cin >> x;
cin >> y;
cin >> z;
x--;
y--;
treeLoc.push_back(pair<int, int>(y, x));
fields[y][x].plant(z);
}
for (int year = 0; year < K; year++) {
treeLoc.clear();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (fields[i][j].isExistTree()) {
treeLoc.push_back(pair<int, int>(i, j));
}
}
}
for (int i = 0; i < treeLoc.size(); i++) {
fields[treeLoc[i].first][treeLoc[i].second].ageSort();
fields[treeLoc[i].first][treeLoc[i].second].feedEat();
}
for (int i = 0; i < treeLoc.size(); i++) {
fields[treeLoc[i].first][treeLoc[i].second].deadTree();
if (!fields[treeLoc[i].first][treeLoc[i].second].isExistTree()) {
treeLoc.erase(treeLoc.begin() + i);
i--;
}
}
int loop = treeLoc.size();
for (int i = 0; i < loop; i++) {
int breedNum = fields[treeLoc[i].first][treeLoc[i].second].breedTreeNum();
if (breedNum > 0) {
for (int breed = 0; breed < breedNum; breed++) {
pair<int, int> loc[] = {
pair<int, int>(treeLoc[i].first - 1, treeLoc[i].second - 1),
pair<int, int>(treeLoc[i].first - 1, treeLoc[i].second ),
pair<int, int>(treeLoc[i].first - 1, treeLoc[i].second + 1),
pair<int, int>(treeLoc[i].first, treeLoc[i].second - 1),
pair<int, int>(treeLoc[i].first, treeLoc[i].second + 1),
pair<int, int>(treeLoc[i].first + 1, treeLoc[i].second - 1),
pair<int, int>(treeLoc[i].first + 1, treeLoc[i].second),
pair<int, int>(treeLoc[i].first + 1, treeLoc[i].second + 1)
};
for (int j = 0; j < 8; j++) {
if (loc[j].second >= 0 && loc[j].second < N && loc[j].first >= 0 && loc[j].first < N) {
fields[loc[j].first][loc[j].second].plant(1);
}
}
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
fields[i][j].addFeed();
}
}
}
treeLoc.clear();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (fields[i][j].isExistTree()) {
treeLoc.push_back(pair<int, int>(j, i));
}
}
}
int result = 0;
for (int i = 0; i < treeLoc.size(); i++) {
result += fields[treeLoc[i].second][treeLoc[i].first].getTreeNum();
}
cout << result;
return 0;
}