#include #include #include using namespace std; const long long INF = 1e18; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int r_max; cin >> r_max; vector t(r_max); for (int i = 0; i < r_max; ++i) { cin >> t[i]; } int k; cin >> k; vector c(k); for (int i = 0; i < k; ++i) { cin >> c[i]; } int m; cin >> m; int max_loc = k; vector> edges; for (int i = 0; i < m; ++i) { int u, v, d; cin >> u >> v >> d; edges.emplace_back(u, v, d); max_loc = max({max_loc, u, v}); } int n = max_loc; // --- Floyd-Warshall for All-Pairs Shortest Paths --- vector> dist(n + 1, vector(n + 1, INF)); for (int i = 1; i <= n; ++i) { dist[i][i] = 0; } for (const auto& edge : edges) { int u, v, d; tie(u, v, d) = edge; dist[u][v] = min(dist[u][v], (long long)d); dist[v][u] = min(dist[v][u], (long long)d); } for (int p = 1; p <= n; ++p) { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (dist[i][p] != INF && dist[p][j] != INF) { dist[i][j] = min(dist[i][j], dist[i][p] + dist[p][j]); } } } } // --- Dynamic Programming --- // dp[i][j]: min time to drink i pints, ending at pub j vector> dp(r_max + 1, vector(k + 1, INF)); // Base Case: 1st pint for (int j = 1; j <= k; ++j) { if (dist[1][j] != INF) { long long finish_time = dist[1][j] + t[0]; if (finish_time <= c[j - 1]) { dp[1][j] = finish_time; } } } // DP transitions for (int i = 2; i <= r_max; ++i) { for (int j = 1; j <= k; ++j) { long long min_arrival_time = INF; for (int p = 1; p <= k; ++p) { if (p == j) continue; if (dp[i - 1][p] != INF && dist[p][j] != INF) { min_arrival_time = min(min_arrival_time, dp[i - 1][p] + dist[p][j]); } } if (min_arrival_time != INF) { long long finish_time = min_arrival_time + t[i - 1]; if (finish_time <= c[j - 1]) { dp[i][j] = finish_time; } } } } // --- Find Result --- int max_pints = 0; for (int i = r_max; i >= 1; --i) { for (int j = 1; j <= k; ++j) { if (dp[i][j] != INF) { max_pints = i; goto end_loops; } } } end_loops: cout << max_pints << endl; return 0; }