#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 260;
#define ll long long
struct mar
{
ll a[N][N];
mar() { memset(a, 0xcf, sizeof(a)); }
mar operator*(mar b)
{
mar ans;
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j++)
for (int k = 1; k < N; k++) ans.a[i][j] = max(ans.a[i][j], a[i][k] + b.a[k][j]);
return ans;
}
} r[35];
struct Node { int t, u, v; } a[N];
bool cmp(Node a, Node b) { return a.t < b.t; }
ll b[N], dp[N][2];
int now = 0, pre = 1;
void solve(int x)
{
for (int i = 0; i <= 30; i++)
if (x & (1 << i) != 0)
{
swap(now, pre);
for (int j = 1; j < N; j++) dp[j][now] = 0xcfcfcfcfcfcfcfcf;
for (int j = 1; j < N; j++)
for (int k = 1; k < N; k++) dp[j][now] = max(dp[j][now], dp[k][pre] + r[i].a[j][k]);
}
}
int main()
{
int n, m, t, k;
cin >> n >> m >> t >> k;
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
r[0].a[4 * n + v][(5 - w) * n + u] = b[v];
}
for (int i = 1; i <= k; i++) cin >> a[i].t >> a[i].u >> a[i].v;
sort(a + 1, a + k + 1, cmp);
for (int i = 0; i < 4; i++)
for (int j = 1; j <= n; j++) r[0].a[i * n + j][(i + 1) * n + j] = 0;
for (int i = 1; i <= 30; i++) r[i] = r[i - 1] * r[i - 1];
memset(dp, 0xcf, sizeof(dp));
dp[4 * n + 1][0] = b[1];
for (int i = 1; i <= k; i++)
{
int x = a[i].t - a[i - 1].t;
solve(x);
dp[4 * n + a[i].u][now] += a[i].v;
}
solve(t - a[k].t);
if (dp[4 * n + 1][now] < 0) cout << "-1" << endl;
else cout << dp[4 * n + 1][now] << endl;
return 0;
}
注:样例就输出了一个很奇怪的数。