/* 
 题目要求统计一个平面图中所有边数为k的面的个数。应该是个经典问题。说说我的算法吧。
枚举每条边，做以下的基本步骤。

基本步骤：以这条边作起始边，不断地找下一条“最左转”的边，并且标记每个点的访问次数，直到某个点第3次被访问为止。
经过这个步骤之后，得到一个顶点序列。容易知道，当且仅当这个顶点序列是2-重复（就是形如12341234这样），
并且是逆时针旋转的，那么就是一个面。
接下去我们就把所有找到的边数为k面进行hash去重，就得到答案。
 */
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
#define inf 0xffffff
#define maxn 210
#define prime 502973

struct Nodes {
    int x, y, cnt;
    int child[maxn];
} p[maxn];

struct Farm {
    int v[maxn];
    int cnt;
};

struct Hash {
    Farm f;
    Hash *next;
};
int n, size, ans;
int used[maxn];
Hash *hash[prime];

int isequal(Farm f1, Farm f2) {
    int i;
    for (i = 0; i < size; i++)
        if (f1.v[i] != f2.v[i])return 0;
    return 1;
}

int hash_insert(Farm f) {
    long long key = 1;
    int i;
    for (i = 0; i < f.cnt; i++)
        key *= f.v[i];
    key %= prime;
    for (Hash *t = hash[key]; t; t = t->next) {
        if (isequal(t->f, f))
            return 0;
    }
    Hash *t = new Hash;
    t->f = f;
    t->next = hash[key];
    hash[key] = t;
    return 1;
}

int cross(int x1, int y1, int x2, int y2) {
    return x1 * y2 - x2*y1;
}

int dot(int x1, int y1, int x2, int y2) {
    return x1 * x2 + y1*y2;
}

int get_len(int dx, int dy) {
    return dx * dx + dy*dy;
}

double get_angle(int k1, int k2, int k3, int k4) {
    int dx1 = p[k2].x - p[k1].x;
    int dy1 = p[k2].y - p[k1].y;
    int dx2 = p[k4].x - p[k3].x;
    int dy2 = p[k4].y - p[k3].y;
    double tmp1 = acos(dot(dx1, dy1, dx2, dy2)*1.0 / (get_len(dx1, dy1) * get_len(dx2, dy2)));
    int tmp2 = cross(dx1, dy1, dx2, dy2);
    if (tmp2 == 0)return 0.0;
    if (tmp2 > 0)return -tmp1;
    return tmp1;
}

int check(int a, int b, Farm &f) {
    int i, j, k, stack[maxn * 4], top;
    int id, minid;
    double min_angle, angle;
    used[a] = 1;
    used[b] = 1;
    stack[0] = a;
    stack[1] = b;
    top = 2;
    while (1) {
        k = stack[top - 1];
        min_angle = inf * 1.0;
        for (i = 1; i <= p[k].cnt; i++) {
            j = p[k].child[i];
            if (j == stack[top - 2])continue;
            angle = get_angle(stack[top - 2], stack[top - 1], stack[top - 1], j);
            if (angle < min_angle) {
                min_angle = angle;
                id = j;
            }
        }
        if (used[id] == 2) {
            if (id != a)return 0;
            if (top & 1)return 0;
            if (top != size * 2)return 0;
            for (i = 0; i < top / 2; i++) {
                if (stack[i] != stack[i + top / 2])
                    return 0;
            }
            int area = 0;
            for (i = 0; i < top / 2; i++) {
                area += cross(p[stack[i]].x, p[stack[i]].y, p[stack[i + 1]].x, p[stack[i + 1]].y);
            }
            if (area <= 0)return 0;
            minid = inf;
            for (i = 0; i < top / 2; i++) {
                if (stack[i] < minid) {
                    minid = stack[i];
                    id = i;
                }
            }
            f.cnt = top / 2;
            for (i = 0; i < top / 2; i++) {
                f.v[i] = stack[id + i];
            }
            return 1;
        } else {
            used[id]++;
            stack[top++] = id;
        }
    }
}

void count_farmland() {
    int i, j, k;
    int flag;
    Farm f;
    memset(hash, 0, sizeof (hash));
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= p[i].cnt; j++) {
            memset(used, 0, sizeof (used));
            flag = check(i, p[i].child[j], f);
            if (flag) {
                if (hash_insert(f)) {
                    ans++;
                }
            }
        }
    }
    return;
}

int main() {
    int i, j, k;
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d", &n);
        for (i = 1; i <= n; i++) {
            scanf("%d%d%d%d", &k, &p[i].x, &p[i].y, &p[i].cnt);
            for (j = 1; j <= p[i].cnt; j++) {
                scanf("%d", &p[i].child[j]);
            }
        }
        scanf("%d", &size);
        ans = 0;
        count_farmland();
        printf("%d\n", ans);
    }
    return 0;
}
