#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
#define eps 1e-10

typedef struct line{
	ll x1,y1;
	ll x2,y2;
}L;

int sgn(ll x){return x<0?-1:x>0;}

int iscloss(L s,L t){
	//点(p,q)が直線f(x,y)=ax+by+c=0のどっち側にあるかはf(p,q)を見ればよい
	//点(x1,y1),(x2,y2)を結ぶ直線の式は(y2-y1)*(x-x1)+(x2-x1)*(y1-y)=0
	ll t1=(s.y2-s.y1)*(t.x1-s.x1)+(s.x2-s.x1)*(s.y1-t.y1);
	ll t2=(s.y2-s.y1)*(t.x2-s.x1)+(s.x2-s.x1)*(s.y1-t.y2);
	ll t3=(t.y2-t.y1)*(s.x1-t.x1)+(t.x2-t.x1)*(t.y1-s.y1);
	ll t4=(t.y2-t.y1)*(s.x2-t.x1)+(t.x2-t.x1)*(t.y1-s.y2);
	//2線分が同一直線上になく、かつ、共有点があればtrue
	//（同一直線上にある2線分が共有点を持ってもfalseが返るので注意）
	return sgn(t1)!=sgn(t2) && sgn(t3)!=sgn(t4);
}

double calcx,calcy;
void calc(L s,L t){
	//交点は、線分tを|t1|:|t2|に内分する点
	ll t1=(s.y2-s.y1)*(t.x1-s.x1)+(s.x2-s.x1)*(s.y1-t.y1);
	ll t2=(s.y2-s.y1)*(t.x2-s.x1)+(s.x2-s.x1)*(s.y1-t.y2);
	t1=llabs(t1);
	t2=llabs(t2);
	calcx=t.x1+(double)(t.x2-t.x1)*t1/(t1+t2);
	calcy=t.y1+(double)(t.y2-t.y1)*t1/(t1+t2);
}

L s,t;
double x[200],y[200];
int st[200];
int idx[200];

int main(){
	int q;
	scanf("%d",&q);
	
	while(q--){
		scanf("%lld%lld%lld%lld",&s.x1,&s.y1,&s.x2,&s.y2);
		int cnt=0;
		int n;
		scanf("%d",&n);
		rep(i,1,n+1){
			int a,b;
			scanf("%lld%lld%lld%lld%lld%lld",&t.x1,&t.y1,&t.x2,&t.y2,&a,&b);
			if(iscloss(s,t)){
				calc(s,t);
				x[cnt]=calcx;
				y[cnt]=calcy;
				st[cnt]=a^b;
				idx[cnt]=cnt;
				cnt++;
			}
		}
		//ソート
		rep(i,0,cnt)rep(j,0,cnt-1){
			if(x[idx[j]]>x[idx[j+1]]+eps || (fabs(x[idx[j]]-x[idx[j+1]])<eps&&y[idx[j]]>y[idx[j+1]]+eps)){
				int temp=idx[j];
				idx[j]=idx[j+1];
				idx[j+1]=temp;
			}
		}
		int ans=0,crr=st[idx[0]];
		rep(i,1,cnt)if(st[idx[i-1]]!=st[idx[i]])ans++;
		printf("%d\n",ans);
	}
}
