#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
FILE *in = fopen("new","r");
struct point{ll s;ll e;};
bool comp(point a,point b)
{
if(a.s>b.s)
return false;
return true;
}
ll max1;
void to_cover(vector<point> a,ll s,ll e,int f_i,int &count)
{
while(1)
{
int j;
for(j=f_i;j<a.size();j++)
if(a[j].s>s)
break;
if(j-f_i==0)
{
count=-1;
return;
}
max1=LONG_MIN;
//int max_i;
for(int i=f_i;i<j;i++)
{
if(a[i].e>max1)
{
max1=a[i].e;
// max_i=i;
}
}
//cout << a[max_i].s << "\t" << a[max_i].e << endl;
count++;
if(max1>=e)
return;
s=max1;f_i=j;
}
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while(t--)
{
ll n,k,m;
cin >> n >> k >> m;
ll s=(n-k)/2 + 1;
ll e = s+k;
vector<point> ax;
vector<point> ay;
for(int i=0;i<m;i++)
{
ll hx,hy;
ll tx,ty;
cin >> hx >> hy >> tx >> ty;
if(hx==tx)
{
point p;
p.s=hy;p.e=ty;
ay.push_back(p);
}
if(hy==ty)
{
point p;
p.s=hx;p.e=tx;
ax.push_back(p);
}
}
sort(ax.begin(),ax.end(),comp);// sort by starting point
sort(ay.begin(),ay.end(),comp);// sort by starting point
int varx=0,vary=0;
to_cover(ax,s,e,0,varx);// chooses the one segment whose starting point is valid and end point is longest for horizontal
to_cover(ay,s,e,0,vary);//chooses the one segment whose starting point is valid and end point is longest for vertical
if(varx==-1 || vary==-1)
cout << -1 << endl;
else
cout << varx+vary << endl;
}
return 0;
}
CiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CkZJTEUgKmluID0gZm9wZW4oIm5ldyIsInIiKTsKCgpzdHJ1Y3QgcG9pbnR7bGwgcztsbCBlO307Cgpib29sIGNvbXAocG9pbnQgYSxwb2ludCBiKQp7CglpZihhLnM+Yi5zKQoJCXJldHVybiBmYWxzZTsKCXJldHVybiB0cnVlOwp9CmxsIG1heDE7CnZvaWQgdG9fY292ZXIodmVjdG9yPHBvaW50PiBhLGxsIHMsbGwgZSxpbnQgZl9pLGludCAmY291bnQpCnsKCXdoaWxlKDEpCgl7CglpbnQgajsKCWZvcihqPWZfaTtqPGEuc2l6ZSgpO2orKykKCQlpZihhW2pdLnM+cykKCQkJYnJlYWs7CglpZihqLWZfaT09MCkKCXsKCQljb3VudD0tMTsKCQlyZXR1cm47Cgl9CgltYXgxPUxPTkdfTUlOOwoJLy9pbnQgbWF4X2k7Cglmb3IoaW50IGk9Zl9pO2k8ajtpKyspCgl7CgkJaWYoYVtpXS5lPm1heDEpCgkJewoJCQltYXgxPWFbaV0uZTsKCQkvLwltYXhfaT1pOwoJCX0KCX0KCS8vY291dCA8PCBhW21heF9pXS5zIDw8ICJcdCIgPDwgYVttYXhfaV0uZSA8PCBlbmRsOwoJY291bnQrKzsKCWlmKG1heDE+PWUpCgkJcmV0dXJuOwoJcz1tYXgxO2ZfaT1qOwkKCX0KfQoKaW50IG1haW4oKQp7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CglpbnQgdDsKCWNpbiA+PiB0OwoJd2hpbGUodC0tKQoJewoJbGwgbixrLG07CgljaW4gPj4gbiA+PiBrID4+IG07CglsbCBzPShuLWspLzIgKyAxOwoJbGwgZSA9IHMrazsKCXZlY3Rvcjxwb2ludD4gYXg7Cgl2ZWN0b3I8cG9pbnQ+IGF5OwoJZm9yKGludCBpPTA7aTxtO2krKykKCXsKCQlsbCBoeCxoeTsKCQlsbCB0eCx0eTsKCQljaW4gPj4gaHggPj4gaHkgPj4gdHggPj4gdHk7CgkJaWYoaHg9PXR4KQoJCXsKCQkJcG9pbnQgcDsgCgkJCXAucz1oeTtwLmU9dHk7CgkJCWF5LnB1c2hfYmFjayhwKTsKCgkJfQoJCWlmKGh5PT10eSkKCQl7CgkJCXBvaW50IHA7CgkJCXAucz1oeDtwLmU9dHg7CgkJCWF4LnB1c2hfYmFjayhwKTsKCQl9Cgl9CgoJc29ydChheC5iZWdpbigpLGF4LmVuZCgpLGNvbXApOy8vIHNvcnQgYnkgc3RhcnRpbmcgcG9pbnQKCXNvcnQoYXkuYmVnaW4oKSxheS5lbmQoKSxjb21wKTsvLyBzb3J0IGJ5IHN0YXJ0aW5nIHBvaW50CglpbnQgdmFyeD0wLHZhcnk9MDsKCXRvX2NvdmVyKGF4LHMsZSwwLHZhcngpOy8vIGNob29zZXMgdGhlIG9uZSBzZWdtZW50IHdob3NlIHN0YXJ0aW5nIHBvaW50IGlzIHZhbGlkIGFuZCBlbmQgcG9pbnQgaXMgbG9uZ2VzdCBmb3IgaG9yaXpvbnRhbCAKCgl0b19jb3ZlcihheSxzLGUsMCx2YXJ5KTsvL2Nob29zZXMgdGhlIG9uZSBzZWdtZW50IHdob3NlIHN0YXJ0aW5nIHBvaW50IGlzIHZhbGlkIGFuZCBlbmQgcG9pbnQgaXMgbG9uZ2VzdCBmb3IgdmVydGljYWwKCglpZih2YXJ4PT0tMSB8fCB2YXJ5PT0tMSkKCQljb3V0IDw8ICAtMSA8PCBlbmRsOwoJZWxzZQoJCWNvdXQgPDwgdmFyeCt2YXJ5IDw8IGVuZGw7Cgl9CiAgICByZXR1cm4gMDsKfQoK