#include using namespace std; #define next ololo const int MX = 100000, LOG = 17; int dist(vector& cycle, int u, int v) { int d = abs(cycle[u] - cycle[v]); return min(cycle.back() - d, d); } vector cycle[MX], next[LOG][MX]; int from[MX], to[MX], cost[MX], n; int solve(int uv, int uc, int vv, int vc) { int d = (vc - uc + n - 1) % n + 1, res = 0; for (int i = LOG - 1; i >= 0; i--) if ((1 << i) <= d) { d -= (1 << i); res += next[i][uc][uv]; uc = (uc + (1 << i)) % n; uv = to[uc]; } return res + dist(cycle[uc], uv, vv); } int main() { int T; ignore = scanf("%d", &T); while (T--) { int p; ignore = scanf("%d %d", &n, &p); for (int i = 0, m; i < n; i++) { cycle[i] = {0}; ignore = scanf("%d", &m); for (int j = 0, x; j < m; j++) { ignore = scanf("%d", &x); cycle[i].push_back(x); } partial_sum(cycle[i].begin(), cycle[i].end(), cycle[i].begin()); } for (int i = 0; i < n; i++) { ignore = scanf("%d %d %d", from + i, to + (i + 1) % n, cost + i); from[i]--; to[(i + 1) % n]--; } for (int i = 0; i < n; i++) { next[0][i].resize(cycle[i].size()); for (size_t j = 0; j < cycle[i].size(); j++) next[0][i][j] = dist(cycle[i], from[i], j) + cost[i]; } for (int k = 0; k + 1 < LOG; k++) for (int i = 0; i < n; i++) { next[k + 1][i].resize(cycle[i].size()); int f = (i + (1 << k)) % n; for (size_t j = 0; j < cycle[i].size(); j++) next[k + 1][i][j] = next[k][i][j] + next[k][f][to[f]]; } while (p--) { int uv, uc, vv, vc; ignore = scanf("%d %d %d %d", &uv, &uc, &vv, &vc); uv--; uc--; vv--; vc--; int d = solve(uv, uc, vv, vc); int full = solve(uv, uc, uv, uc); full -= dist(cycle[vc], from[vc], to[vc]); full += dist(cycle[vc], from[vc], vv); full += dist(cycle[vc], to[vc], vv); printf("%d\n", min(d, full - d)); } } return 0; }