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

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

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

// * 許容する誤差ε
const double EPS = 1e-9;
// * Infinity
const double INF = 1e12;
// * 円周率
const double PI = acos(-1.0);
// * Infinity 2
const P INF_P(INF,INF);

// * 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つのスカラーが等しいかどうか
bool equal(double a, double b) {
	return ( fabs( a - b ) < EPS );
}

// * 2点間の距離
double dist(P p1, P p2) {
	return abs(p1 - p2);
}

// * 内積 (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 <=> cross(a, b) = 0
int is_parallel(P a1, P a2, P b1, P b2) {
    return equal( cross(a1-a2, b1-b2), 0.0 );
}

// CCW : 反時計回り (Counter Clock Wise)
// CW : 時計回り (Clock Wise)
enum {CCW=1, CW=-1, ON=0};
// * 3点がどちら回りであるか返す, 3点が1直線に乗っているときは ON を返す
int ccw(const P &a, P b, P c) {
	b-=a, c-=a;
	double rotdir = cross(b,c);
	if( rotdir >  EPS ) return CCW;
	if( rotdir < -EPS ) return CW;
	return ON;
}

// 線分の表現
struct Segment{
	// 点 a, b を端点とする線分
	P a, b;
	// コンストラクタで初期化
	Segment(P a_, P b_) {
		// x 座標の小さいほうの点を 点 a とする. (不要なときはこの1行を削除すること!!!)
		if( b_ < a_ ) swap(a_,b_);
		a = a_; b = b_;
	}
	// 線分の長さを返す
	double length() { return abs(a-b); }
	// 中点を返す
	P mid() { return P( (a.X+b.X)/2.0 , (a.Y+b.Y)/2.0 ); }
	// 点 p が線分上にあるかどうか
	bool contain(P p) { return (abs(a-p) + abs(p-b) < abs(a-b) + EPS); }
	// 線分と点 p の距離
	double distance(P p) {
		if( dot(b-a, p-a) < EPS ) return abs(p-a);
		if( dot(a-b, p-b) < EPS ) return abs(p-b);
		return abs(cross(b-a, p-a)) / abs(b-a);
	}
	// 線分 s と交差しているかどうかを返す.
	bool is_intersection(const Segment& s){
		return ( ccw(a, b, s.a)   * ccw(a, b, s.b) <= 0 && 
		         ccw(s.a, s.b, a) * ccw(s.a, s.b, b) <= 0 );
	}
	// 線分の交差判定と交点計算
	bool intersection(Segment s, P& p) {
		bool result = is_intersection( s );
		if( result ) {
			double d1 = abs( cross(s.b-s.a, a-s.a) );
			double d2 = abs( cross(s.b-s.a, b-s.a) );
			
			if( abs(d1) < EPS && abs(d2) < EPS ) { // 2つの線分が同じ直線上にあるとき
				if( this->contain(s.a) ) {
					p = s.a;
				}else if( this->contain(s.b) ) {
					p = s.b;
				}else if( s.contain( a ) ) {
					p = a;
				}else if( s.contain( b ) ) {
					p = b;
				}else {
					p = INF_P;
				}
			}else if( abs(d1) < EPS ) {
				p = INF_P;
			}else {
				double t = d1 / (d1 + d2);
				p = a + (b-a) * t;
			}
		}else{
			p = INF_P;
		}
		return result;
	}
	// 線分と線分の距離
	double distance(Segment s) {
		if( is_intersection(s) ) return 0.0;
		return min( min(distance(s.a), distance(s.b)), min(s.distance(a), s.distance(b)) );
	}
	// デバッグ出力
	void print() { printf("line(%f,%f,%f,%f); \n", a.X, a.Y, b.X, b.Y ); }
};

int main(){
    int N;
    cin >> N;
    for(int i_=0 ; i_ < N ; i_++ ){
        int xa, ya, xb, yb, n;
        cin >> xa >> ya >> xb >> yb;
        // 駅A と 駅B を結ぶ 線分AB
        P A(xa,ya), B(xb,yb);
        Segment AB( A, B );
         
        // 点Aと交点の距離と交点で地下と高架のどちらを通るべきか保持
        // v[i] := (点Aからの距離, 0 or 1 )
        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);
            Segment ST( S, T );
             
            // 交差するかどうか
            if( AB.is_intersection(ST) ){
            	P p;
            	AB.intersection(ST, p);
                // 平行かどうか
                if( is_parallel( A , B , S , T ) ){
                    continue;
                }
                // 距離
                double d = dist( A , p );
                v.push_back( pair<double,int>(d, o^l) );
            }
        }
         
        sort( v.begin() , v.end() );
        int ans=0;
        for(int i=1 ; i < v.size() ; i++ ){
            if( v[i-1].second != v[i].second ){
                ans++;
            }
        }
        cout << ans << endl;
    }
}

Measured memory_bytes: 944