#include using namespace std; class cycle{ public: vector u; cycle() {u.push_back(0);} void init() {for (int i = 1; i < u.size(); i++) u[i] += u[i - 1];} int dis(int x, int y) { if (x > y) swap(x, y); int d = u[y] - u[x]; return min(d, u[u.size() - 1] - d); } } C[100200], Main, ept; int N, P, key[100200][2]; void clr() { for (int i = 0; i < N; i++) key[i][0] = key[i][1] = 0, C[i] = ept; Main = ept; N = P = 0; } void doit() { int i, j, k, v1, v2, c, la = -1, fi, c1, c2; clr(); scanf("%d %d", &N, &P); for (i = 0; i < N; i++) { scanf("%d", &j); while (j--) scanf("%d", &k), C[i].u.push_back(k); C[i].init(); } Main.u.push_back(2333);//this is a placeholder for (i = 0; i < N; i++) { scanf("%d %d %d", &v1, &v2, &c); v1--; v2--; key[i][1] = v1; key[(i + 1) % N][0] = v2; if (i) Main.u.push_back(C[i].dis(key[i][0], key[i][1])); Main.u.push_back(c); } Main.u[1] = C[0].dis(key[0][0], key[0][1]); Main.init(); while (P--) { scanf("%d %d %d %d", &v1, &c1, &v2, &c2); v1--; v2--; c1--; c2--; int ans = 1000000000; for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) ans = min(ans, C[c1].dis(v1, key[c1][i]) + C[c2].dis(v2, key[c2][j]) + Main.dis(c1 << 1 | i, c2 << 1 | j)); printf("%d\n", ans); } } int main() {int T; scanf("%d", &T); while (T--) doit(); return 0;}