#include <iostream>
#include <vector>
#include <complex>
#include <cmath>
#include <algorithm>
using namespace std;

//XY座標
#define X real()
#define Y imag()

// 許容する誤差ε
const double EPS = (1e-8);
// 円周率
const double PI = 3.14159265358979;
// infinity
const double INF = 1e12;

// 点の表現
typedef complex<double> P;

// complex<double> の順序を定義する
namespace std {
	bool operator < (const P& a, const P& b) {
		return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b);
	}
}

// 2乗する
double sq(double x){
	return x * x;
}

// 2つのスカラーが等しいかどうか
bool equal(double a, double b){
	return ( fabs( a - b ) < EPS );
}
// 2つのベクトルが等しいかどうか
bool eq_v(P a, P b){
	return ( equal( a.X, b.X ) && equal( a.Y, b.Y ) );
}

// ベクトルaの単位ベクトルを求める
P unit(P a){
	return a / abs(a);
}

// ベクトルaの法線ベクトルを求める
vector<P> normal(P a){
	vector<P> vp;
	vp.push_back( a * P(0,  1) );
	vp.push_back( a * P(0, -1) );
	return vp;
}

// ベクトル a の単位法線ベクトルを求める
vector<P> normal_unit(P a){
	vector<P> vp;
	vp.push_back( (a * P(0,  1)) / abs(a) );
	vp.push_back( (a * P(0, -1)) / abs(a) ) ;
	return vp;
}

// 内積 (dot product) : a・b = |a||b|cosΘ
double dot(P a, P b) {
	return real( conj(a) * b );
}

// 外積 (cross product) : a×b = |a||b|sinΘ
double cross( P a, P b) {
	return imag( conj(a) * b );
}

// 2 直線の直交判定 : a⊥b <=> dot(a, b) = 0
int is_orthogonal(P a1, P a2, P b1, P b2) {
	return equal( dot(a1-a2, b1-b2), 0.0 );
}

// 2 直線の平行判定 : a//b <=> cross(a, b) = 0
int is_parallel(P a1, P a2, P b1, P b2) {
	return equal( cross(a1-a2, b1-b2), 0.0 );
}

// 点 c が直線 a, b 上にあるかどうか 
int is_point_on_line(P a, P b, P c) {
	return equal( cross(b-a, c-a), 0.0 );
}

// 下記は (1) より (2) のほうが簡潔で良い.

// 点 c が線分 a, b 上にあるかどうか (1)
int is_point_on_line_1(P a, P b, P c) {
  return equal( cross(b-a, c-a), 0.0 ) &&
         (dot(b-a, c-a) > -EPS) &&
         (dot(a-b, c-b) > -EPS);
}

// 点 c が線分 a, b 上にあるかないか(2)
int is_point_on_line_2(P a, P b, P c) {
	// |a-c| + |c-b| <= |a-b| なら線分上
	return (abs(a-c) + abs(c-b) < abs(a-b) + EPS);
}

// 点 a, bを通る直線と点 c との距離
double distance_l_p(P a, P b, P c) {
	return abs(cross(b-a, c-a)) / abs(b-a);
}

// 点 a, b を端点とする線分と点 c との距離
double distance_ls_p(P a, P b, P c) {
	if( dot(b-a, c-a) < EPS ) return abs(c-a);
	if( dot(a-b, c-b) < EPS ) return abs(c-b);
	return abs(cross(b-a, c-a)) / abs(b-a);
}

// a1, a2 を端点とする線分と b1, b2 を端点とする線分の交差判定
int is_intersected_ls(P a1, P a2, P b1, P b2) {
	return ( cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS ) &&
		   ( cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < EPS );
}

// a1, a2 を端点とする線分と b1, b2 を端点とする線分の交点計算
P intersection_ls(P a1, P a2, P b1, P b2) {
	P b = b2-b1;
	double d1 = abs(cross(b, a1-b1));
	double d2 = abs(cross(b, a2-b1));
	double t = d1 / (d1 + d2);
	
	return a1 + (a2-a1) * t;
}

// a1, a2 を通る直線と b1, b2 を通る直線の交差判定
int is_intersected_l(P a1, P a2, P b1, P b2) {
	return !equal( cross(a1-a2, b1-b2), 0.0 );
}

// a1, a2 を通る直線と b1, b2 を通る直線の交点計算
P intersection_l(P a1, P a2, P b1, P b2) {
	P a = a2 - a1; P b = b2 - b1;
	return a1 + a * cross(b, b1-a1) / cross(b, a);
}

int main(){
	int N;
	cin >> N;
	for(int i_=0 ; i_ < N ; i_++ ){
		int xa, ya, xb, yb, n;
		cin >> xa >> ya >> xb >> yb;
		P A(xa,ya), B(xb,yb);
		
		// 点Aと交点の距離と交点で地下と高架のどちらを通るべきか保持
		vector< pair<double,int> > v;
		
		cin >> n;
		for(int j_=0 ; j_ < n ; j_++ ){
			int sx,sy,tx,ty,o,l;
			cin >> sx >> sy >> tx >> ty >> o >> l;
			P S(sx,sy), T(tx,ty);
			
			// 交差するかどうか
			if( is_intersected_ls( A , B , S , T ) ){
				// 平行かどうか
				if( is_parallel( A , B , S , T ) ){
					continue;
				}
				// 交点
				P p = intersection_l( A , B , S , T );
				if( abs(A-p) < EPS || abs(B-p) < EPS ) continue;
				// 距離
				double dist = abs(A-p);
				
				v.push_back( pair<double,int>(dist,o^l) );
			}
		}
		
		sort( v.begin() , v.end() );
		if( v.size() < 2 ){
			cout << 0 << endl;
		}else{
			int ans = 0;
			int d = v[0].second;
			for(int i=1 ; i < v.size() ; i++ ){
				if( d != v[i].second ){
					ans++;
					d = v[i].second;
				}
			}
			cout << ans << endl;
		}
	}
}

Measured memory_bytes: 944