#include <cstdio>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <climits>
#include <cfloat>
using namespace std;

int n, m;                     // 料理の種類数、注文の数

vector<string> name;          // 料理の名前
map<string, int> index;       // 料理の番号
vector<int> limit, makeTime;  // 一度に調理できる最大数、調理時間

vector<int> come, dishNum;    // 来店時間、各注文の料理の数
vector<vector<string> > dish; // 注文された料理の名前

class Data
{
public:
    int time, id;
    int a, b;
    Data(int time0, int id0, int a0, int b0){
        time = time0;
        id = id0;
        a = a0;
        b = b0;
    }
    bool operator< (const Data& d) const{
        if(time < d.time)
            return true;
        if(time == d.time){
            if(id == -1)
                return false;
            if(d.id == -1)
                return true;
            return make_pair(-makeTime[id], id) < make_pair(-makeTime[d.id], d.id);
        }
        return false;
    }
};

int main()
{
    bool isFirst = true;

    for(;;){
        cin >> n >> m;
        if(n == 0)
            return 0;

        if(isFirst)
            isFirst = false;
        else
            cout << endl;

        name.resize(n);
        limit.resize(n);
        makeTime.resize(n);
        index.clear();
        for(int i=0; i<n; ++i){
            cin >> name[i] >> limit[i] >> makeTime[i];
            index[name[i]] = i;
        }

        come.resize(m);
        dishNum.resize(m);
        dish.resize(m);
        multiset<Data> ms1, ms2;        // 各種イベント
        vector<vector<int> > finish(m); // 最後の料理が提供された時間
        for(int i=0; i<m; ++i){
            cin >> come[i] >> dishNum[i];
            dish[i].resize(dishNum[i]);
            finish[i].resize(dishNum[i], -1);
            for(int j=0; j<dishNum[i]; ++j){
                cin >> dish[i][j];
                ms1.insert(Data(come[i], index[dish[i][j]], i, j));
            }
        }

        vector<queue<pair<int, int> > > q(n); // 各料理の注文のキュー
        bool isFree = true;                   // 料理人が次の調理を始められるかどうか
        while(!ms1.empty()){
            int time = ms1.begin()->time;
            while(!ms1.empty() && time == ms1.begin()->time){
                Data d = *ms1.begin();
                ms1.erase(ms1.begin());

                if(d.id == -1){
                    isFree = true;
                }else{
                    q[d.id].push(make_pair(d.a, d.b));
                    ms2.insert(d);
                }
            }

            while(isFree && !ms2.empty()){
                Data d = *ms2.begin();
                ms2.erase(ms2.begin());

                if(finish[d.a][d.b] == -1){
                    int rest = limit[d.id];
                    while(rest > 0 && !q[d.id].empty()){
                        int a = q[d.id].front().first;
                        int b = q[d.id].front().second;
                        q[d.id].pop();

                        if(finish[a][b] == -1){
                            finish[a][b] = time + makeTime[d.id];
                            -- rest;
                        }
                    }
                    isFree = false;
                    ms1.insert(Data(time + makeTime[d.id], -1, -1, -1));
                }
            }
        }

        for(int i=0; i<m; ++i)
            cout << *max_element(finish[i].begin(), finish[i].end()) << endl;
    }
}

Measured memory_bytes: 1396