#include<cstdio>
#include<iostream>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<assert.h>
#define ls o<<1
#define rs o<<1|1
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=500+10;
void read(int &x){
int fx=1;
x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') fx=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
x=x*fx;
}
struct Node{
int cost,fr,be;
}a[N];
int n,q;
int dp[N][N];
int ans[N][N];
int main()
{
read(n);
read(q);
for(int i=1;i<=n;i++)
{
read(a[i].cost);
read(a[i].fr);
read(a[i].be);
}
for(int i=1;i<=n;i++)
{
for(int v=500;v>=a[i].cost;v--)
{
for(int f=500;f>=a[i].fr;f--)
{
dp[v][f]=max(dp[v][f],dp[v-a[i].cost][f-a[i].fr]+a[i].be);
}
}
}
for(int j=0;j<=500;j++)
{
for(int k=j;k<=500;k++)
{
ans[0][j]=max(ans[0][j],dp[0][k]);
}
}
for(int i=1;i<=500;i++)
{
for(int j=0;j<=500;j++)
{
for(int k=j;k<=500;k++)
{
ans[i][j]=max(ans[i-1][j],dp[i][k]);
}
}
}
for(int i=1;i<=q;i++)
{
int c,f;
read(c);
read(f);
printf("%d\n",ans[c][f]);
}
}