#include <bits/stdc++.h>
using namespace std;
const long long inf = (long long) 1e18;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> B(n + 1, vector<int>(k + 1)), S = B;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
cin >> B[i][j] >> S[i][j];
}
}
vector<vector<pair<int, int>>> g(n + 1);
while (m--) {
int u, v, w;
cin >> u >> v >> w;
g[u].emplace_back(v, w);
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
vector dp(n + 1, vector(k + 1, vector<long long>(n + 2, -inf)));
dp[i][0][0] = 0;
for (int j = 1; j <= n; j++) {
for (int u = 1; u <= n; u++) {
for (int d = 0; d <= n; d++) {
for (int K = 1; K <= k; K++) {
if (dp[u][K][d] == -inf) continue;
if (S[u][K] != -1) {
dp[u][0][d] = max(dp[u][0][d], dp[u][K][d] + S[u][K]);
}
}
for (int K = 1; K <= k; K++) {
if (dp[u][0][d] == -inf) continue;
if (B[u][K] != -1) {
dp[u][K][d] = max(dp[u][K][d], dp[u][0][d] - B[u][K]);
}
}
for (auto [v, w] : g[u]) {
for (int K = 0; K <= k; K++) {
if (dp[u][K][d] != -inf) {
dp[v][K][d + 1] = dp[u][K][d];
}
if (K == 0) continue;
if (B[u][K] != -1 && dp[u][0][d] != -inf) {
dp[v][K][d + 1] = max(dp[v][K][d + 1], dp[u][0][d] - B[u][K]);
}
if (S[u][K] != -1 && dp[u][K][d] != -inf) {
dp[v][0][d + 1] = max(dp[v][0][d + 1], dp[u][K][d] + S[u][K]);
}
}
}
}
}
}
for (int d = 1; d <= n; d++) {
ans = max(ans, dp[i][0][d] / d);
}
}
cout << ans << '\n';
return 0;
}