#include<iostream>
#include<cstring>
using namespace std;
const int N = 5e2 + 10;
int f[N][N][N], n, m;
struct node {
int cost;
int fri;
int be;
}flow[N];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d%d%d", &flow[i].cost, &flow[i].fri, &flow[i].be);
}
memset(f, -0x3f3f3f3f, sizeof f);
f[1][flow[1].cost][flow[1].fri] = flow[1].be;
for (int j = flow[1].cost; j <N; j++) {
for (int k = flow[1].fri; k >= 0; k--) {
f[1][j][k] = flow[1].be;
}
}
for (int i = 2; i <= n; i++) {
for (int j = 0; j < N; j++) {
for (int k = N - 2; k >= 0; k--) {
f[i][j][k] = max(f[i][j][k + 1], f[i - 1][j][k]);
if (j >= flow[i].cost) {
if (k >= flow[i].fri) {
f[i][j][k] = max(f[i][j][k], f[i - 1][j - flow[i].cost][k-flow[i].fri] + flow[i].be);
}
else {
f[i][j][k] = max(f[i][j][k], f[i - 1][j - flow[i].cost][0] + flow[i].be);
f[i][j][k] = max(f[i][j][k], flow[i].be);
}
}
}
}
}
for (int i = 1; i <= m; i++) {
int c, fri;
scanf("%d%d", &c, &fri);
if (f[n][c][fri] < 0) {
f[n][c][fri] = 0;
}
printf("%d\n", f[n][c][fri]);
}
return 0;
}