#include <iostream>
#include <vector>
#include <utility>
#include <chrono>

auto start = std::chrono::system_clock::now();
auto msec() {
	auto end = std::chrono::system_clock::now();
	auto dur = end - start;
	auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(dur).count();
	return ms;
}

int main() {
		
	// recieve |V| and |E|
	int V, E; std::cin >> V >> E;
	std::vector<std::vector<std::pair<int, int>>> G(V);
	
	for(int i = 0; i < E; i++) {
		// recieve edges
		int u, v, d; std::cin >> u >> v >> d;
		u--; v--;
		G[u].push_back({v, d});
		G[v].push_back({u, d});
	}

	// calc cost
	std::vector<std::vector<int>> D(V,std::vector<int>(V));
	for(int i = 0; i < V; i++){
		for(int j = 0; j < V; j++){
			D[i][j] = 999999999;
		}
		std::vector<bool> flag(V);
		D[i][i] = 0;
		for(int j = 0; j < V; j++){
			int minnode = -1;
			int mincost = 999999999;
			for(int k = 0; k < V; k++){
				if(flag[k]==false && D[i][k] < mincost){
					minnode = k;
					mincost = D[i][k];
				}
			}
			flag[minnode] = true;
			for(int k = 0; k < G[minnode].size(); k++){
				if(D[i][minnode]+G[minnode][k].second < D[i][G[minnode][k].first]){
					D[i][G[minnode][k].first] = D[i][minnode]+G[minnode][k].second;
				}
			}
		}
	}

	std::cerr << msec() << std::endl;

	int Tmax; std::cin >> Tmax;
	long long score = 0;
	std::vector<int> orderFlag;
	std::vector<std::pair<int, int>> ORDER;

	int nowNode = 0;
	int targetNode = 0;
	int remainDist = 0;
	int unloadedBaggageCount = 0;
	int loadedBbaggageCount = 0;
	int deliveredCount = 0;
	const int wantGoStoreRating = 130;
	const int lateDeliveryEmphasisRating = 5;

	// recieve info
	for(int t = 0; t < Tmax; t++) {
		int Nnew; std::cin >> Nnew;
		for(int j = 0; j < Nnew; j++) {
			int new_id, dst; std::cin >> new_id >> dst;
			dst--;
			orderFlag.push_back(0);
			ORDER.push_back({t, dst});
			unloadedBaggageCount++;
		}
		// insert your code here to get more meaningful output
		int ans = -1;
		if(remainDist == 0){
			nowNode = targetNode;
			int mintarget = -1;
			int mincost = 999999999;
			for(int j = 0; j < ORDER.size(); j++){
				if(orderFlag[j] == 1 && nowNode == ORDER[j].second){
					score += Tmax * Tmax - (t - ORDER[j].first) * (t - ORDER[j].first);
					deliveredCount++;
					orderFlag[j] = 2;
					loadedBbaggageCount--;
				}
				if(nowNode == 0 && orderFlag[j] == 0){
					orderFlag[j] = 1;
					unloadedBaggageCount--;
					loadedBbaggageCount++;
				}
			}
			for(int j = 0; j < ORDER.size(); j++){
				if(orderFlag[j] == 0){
					int cost = (D[nowNode][0]+D[0][ORDER[j].second]) * 10000 / (10000 + unloadedBaggageCount * wantGoStoreRating)  * 100000 / (100000 + (t - ORDER[j].first) * lateDeliveryEmphasisRating);
					if(cost <= mincost){
						mintarget = 0;
						mincost = cost;
					}
				}
				if(orderFlag[j] == 1){
					int cost = D[nowNode][ORDER[j].second] * 100000 / (100000 + (t - ORDER[j].first) * lateDeliveryEmphasisRating);
					if(cost < mincost){
						mintarget = ORDER[j].second;
						mincost = cost;
					}
				}
			}
			if(mintarget == -1 && nowNode > 0){
				mintarget = 0;
			}
			int minNextCost = 999999999;
			if(mintarget >= 0){
				for(int j = 0; j < G[nowNode].size(); j++){
					if(D[G[nowNode][j].first][mintarget] < minNextCost){
						ans = G[nowNode][j].first + 1;
						targetNode = ans - 1;
						remainDist = G[nowNode][j].second - 1;
						minNextCost = D[G[nowNode][j].first][mintarget];
					}
				}
            }
		} else {
			ans = targetNode + 1;
			remainDist--;
		}
		std::cout << ans << std::endl;
		//if(t % 1000 == 999){
		//	std::cerr << msec() << " " << ORDER.size() << " " << unloadedBaggageCount << "-" << loadedBbaggageCount << "-" << deliveredCount << " " << D[nowNode][0] << std::endl;
		//}
	}
	std::cerr << msec() << " " << score << " " << deliveredCount << std::endl;
	std::cerr << score * 30 << std::endl;
	return 0;
}


Measured memory_bytes: 1152