#include <algorithm>
#include <cmath>
#include <climits>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
#include <cassert>
#include <functional>

using namespace std;

#define LOG(...) printf(__VA_ARGS__)
//#define LOG(...)
#define FOR(i,a,b) for(int i=(int)(a);i<(int)(b);++i)
#define REP(i,n) for(int i=0;i<(int)(n);++i)
#define ALL(a) (a).begin(),(a).end()
#define RALL(a) (a).rbegin(),(a).rend()
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())
#define RSORT(c) sort((c).rbegin(),(c).rend())
#define CLR(a) memset((a), 0 ,sizeof(a))

typedef long long ll;
typedef unsigned long long ull;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vb> vvb;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int dx[] = { -1, 0, 1, 0 }; const int dy[] = { 0, 1, 0, -1 };


struct rail{
	int sx;
	int sy;
	int gx;
	int gy;
};

double cross(rail v1,rail v2){//?????????v1?????????????????????
	int cv1v2=(v1.gx - v1.sx)*(v2.gy - v2.sy) - (v1.gy - v1.sy)*(v2.gx - v2.sx);
	int cvv2 = (v2.sx - v1.sx)*(v2.gy - v2.sy) - (v2.sy-v1.sy)*(v2.gx - v2.sx);
	if (cv1v2 == 0.0)
		return 0.0;
	return (double)cvv2/(double)cv1v2;
}
struct cross_t{
	int no;
	double dis;
};

bool operator < (const cross_t &left, const cross_t &right){
	return left.dis < right.dis;
};
int main() {
	ofstream ofs("out.txt");
	int dataset;
	cin >> dataset;
	while (dataset--){
		rail atob;
		cin >> atob.sx;
		cin >> atob.sy;
		cin >> atob.gx;
		cin >> atob.gy;
		int n;
		cin >> n;
		vector<rail> vr(n);
		vector<bool> high_b(n);
		priority_queue<cross_t> P;
		REP(i, n){
			cin >> vr[i].sx;
			cin >> vr[i].sy;
			cin >> vr[i].gx;
			cin >> vr[i].gy;
			int mine,high;
			cin >> mine;
			cin >> high;
			high_b[i] = (mine == high);
			double t1 = cross(atob, vr[i]);
			double t2 = cross(vr[i], atob);
			if (0.0<t1 && t1<1.0&&0.0<t2 && t2<1.0)P.push({ i, t1 });
		}
		bool b=false;
		int ans = 0;
		int ps = P.size();

		REP(i, ps){
			cross_t p = P.top();
			P.pop();
			if (i == 0){
				b = high_b[p.no];
			}else{
				if (b != high_b[p.no]){
					ans++;
					b = high_b[p.no];
				}
			}
			//cout << p.dis << " : " << high_b[p.no] << endl;
		}
		ofs << ans << endl;
		cout << (ans) << endl;
	}
}