#include <iostream>
#include <cstring>
using namespace std;
template<typename T=int>
inline T read(){
T X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+(ch^48),ch=getchar();
if(flag) return X;
return ~(X-1);
}
template<typename T=int>
inline void write(T X){
if(X<0) putchar('-'),X=~(X-1);
T s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar('\n');
}
const int N=5e2+5,inf=0x3f3f3f3f;
int n,q,cst,few;
int co[N],fe[N],w[N];
int f[N][N]; // f[j][k]: 总价j,新鲜程度k,最大美丽度
int ans[N][N]; // ans[j][k]: 总价小于等于j,新鲜程度大于等于k 的最大美丽度
int main(){
memset(f,-inf,sizeof(f));
n=read(),q=read();
for(int i=1; i<=n; i++)
co[i]=read(),fe[i]=read(),w[i]=read();
f[0][0]=0;
for(int i=1; i<=n; i++)
for(int j=500; j>=co[i]; j--)
for(int k=500; k>=fe[i]; k--)
f[j][k]=max(f[j][k],f[j-co[i]][k-fe[i]]+w[i]);
for(int i=0; i<=500; i++) // 状态变化:由 恰好最大值 变为 i小于等于,j大于等于的最大值
for(int j=500; j>=0; j--)
ans[i][j]=max(f[i][j],max(i ? ans[i-1][j] : -inf,ans[i][j+1]));
while(q--){
cst=read(),few=read();
write(ans[cst][few]);
}
return 0;
}
awa