#include <stdio.h>

/* 90度単位の回転行列 */
int ROTATION[4][2][2] = {
	{{1, 0}, {0, 1}},
	{{0, -1}, {1, 0}},
	{{-1, 0}, {0, -1}},
	{{0, 1}, {-1, 0}}
};

typedef struct { int x; int y; } Vector;

Vector rotate(Vector v, int angle) {
	Vector w;
	w.x = v.x * ROTATION[angle][0][0] + v.y * ROTATION[angle][0][1];
	w.y = v.x * ROTATION[angle][1][0] + v.y * ROTATION[angle][1][1];
	return w;
}

/* 折れ線 */
typedef struct {
	int m;
	int x[10];
	int y[10];
} Polygon;

/* 標準入力から折れ線を読み込む */
void scanPolygon(Polygon *p) {
	int i;
	scanf("%d", &(p->m));
	for (i = 0; i < p->m; i++) scanf("%d%d", &(p->x[i]), &(p->y[i]));
}

/* 2つの折れ線が同じ形状か判定する */
int congruent(Polygon p1, Polygon p2) {
	int i, j;
	if (p1.m != p2.m) return 0;
	/* 90度づつ回転させて判定する */
	for (i = 0; i < 4; i++) {
		/* 各辺を比較する */
		for (j = 0; j < p1.m - 1; j++) {
			Vector v = {p2.x[j+1] - p2.x[j], p2.y[j+1] - p2.y[j]};
			v = rotate(v, i);
			if (p1.x[j+1] - p1.x[j] != v.x || p1.y[j+1] - p1.y[j] != v.y) break; /* 不一致 */
		}
		if (j == p1.m - 1) return 1;
	}
	return 0;
}

int main(void) {
	int n; /* データセット数 */
	Polygon s0, s1, p; /* 折れ線 */
	int i;

	/* データセット毎の処理 */
	while (scanf("%d", &n) == 1 && n >= 1 && n <= 50) {
		/* 折れ線0をs0として入力する */
		scanPolygon(&s0);
		/* 折れ線0の頂点を逆順にしたs1を生成する */
		s1.m = s0.m;
		for (i = 0; i < s0.m; i++) {
			s1.x[s0.m - 1 - i] = s0.x[i];
			s1.y[s0.m - 1 - i] = s0.y[i];
		}

		/* 折れ線毎の処理 */
		for (i = 1; i <= n; i++) {
			scanPolygon(&p); /* 折れ線1?nを入力する */
			if (congruent(s0, p)) printf("%d\n", i);
			else if (congruent(s1, p)) printf("%d\n", i);
		}

		printf("+++++\n"); /* データセットの区切り */
	}

    return 0;
}