
%5C%5C%0A%26%E5%A6%82%E6%9E%9C2%E5%9C%A8%E5%89%8D%EF%BC%9As2%3Da2-b2a2%2Ba1-b1(c1%2Bc2)%5C%5C%0A%26%E5%A6%82%E6%9E%9Cs1%3Es2%E9%82%A3%E4%B9%881%E5%9C%A8%E5%89%8D%E9%9D%A2%E3%80%82%5C%5C%0A%26s1%3Es2%E5%8C%96%E7%AE%80%E5%BE%97%E5%88%B0%EF%BC%9Ab1c2%3Eb2c1%5C%5C%0A%26%E9%82%A3%E4%B9%88%E6%88%91%E4%BB%AC%E6%8C%89b1c2%3Eb2c1%E6%8E%92%E5%BA%8F%E5%86%8D01%E8%83%8C%E5%8C%85%E5%B0%B1%E5%8F%AF%E4%BB%A5%E4%BA%86%E3%80%82%0A%5Cend%7Balign*%7D)
#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct Node{
LL a, b, c;
}a[1000005];
LL b[1000005], f[1000005];
int main(){
int n, m, T; scanf("%d%d%d", &n, &m, &T);
for(int i=1; i<=n; i++){
scanf("%lld", &b[i]);
}
for(int i=1; i<=m; i++){
scanf("%lld%lld%lld", &a[i].b, &a[i].a, &a[i].c);
a[i].b=b[a[i].b];
}
sort(a+1, a+1+m, [](Node &a, Node &b){return a.b*b.c>b.b*a.c;});
memset(f, -0x3f, sizeof(f));
f[0]=0;
for(int i=1; i<=m; i++){
for(int j=T; j>=0; j--){
if(j>=a[i].c){
f[j]=max(f[j], f[j-a[i].c]+a[i].a-a[i].b*j);
}
}
}
LL ans=-1ll<<60;
for(int i=1; i<=T; i++){
ans=max(ans, f[i]);
}
printf("%lld\n", ans);
return 0;
}