#include <iostream>
#include <set>
#include <map>
#include <cmath>
#define ll_int long long int
#define l_double long double
using namespace std;
class line_coeff {
public:
ll_int a, b;
l_double c;
line_coeff(ll_int x, ll_int y, l_double z) {
if(x < 0) {
a = -x;
b = -y;
c = -z;
}
else {
a = x;
b = y;
c = z;
}
minimize_coeff();
}
friend ostream& operator << (ostream&, line_coeff);
bool operator <(const line_coeff& rhs) const {
if(a==rhs.a && b==rhs.b && c==rhs.c) return false;
return true;
}
bool operator >(const line_coeff& rhs) const {
if(a==rhs.a && b==rhs.b && c==rhs.c) return false;
return true;
}
static ll_int gcd(ll_int x, ll_int y) {
if(!y) return x;
return gcd(y, x%y);
}
void minimize_coeff() {
ll_int gcd_val = gcd(abs(a), abs(b));
a /= gcd_val;
b /= gcd_val;
c /= gcd_val;
}
};
ostream& operator << (ostream &out, line_coeff coeff) {
out<<coeff.a<<" "<<coeff.b<<" "<<coeff.c;
return out;
}
int main() {
set<line_coeff> line_set;
ll_int t, n, a, b, ans, max_x, max_y, prev_val=0; l_double c;
map<pair<ll_int,ll_int>,ll_int> m;
cin>>t;
while(t--) {
ans = 0;
cin>>n;
max_x = max_y = 0;
while(n--) {
ll_int prev_size = line_set.size();
cin>>a>>b>>c;
line_set.insert(line_coeff(a, b, c));
if(a==0 && line_set.size()>prev_size) max_x++;
if(b==0 && line_set.size()>prev_size) max_y++;
}
for(set<line_coeff>::iterator it=line_set.begin(); it!=line_set.end(); it++)
m[make_pair(it->a,it->b)]++;
ll_int max_val = 0;
for(map<pair<ll_int,ll_int>,ll_int>::iterator it=m.begin(); it!=m.end(); it++) {
if(it->second > max_val) max_val = it->second;
}
if(max_x>max_y && max_x>max_val) ans = max_x;
else if(max_y>max_x && max_y>max_val) ans = max_y;
else if(max_val==1 && n!=1) ans = 0;
else ans = max_val;
cout<<ans<<endl;
line_set.clear();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8Y21hdGg+CgojZGVmaW5lIGxsX2ludCBsb25nIGxvbmcgaW50CiNkZWZpbmUgbF9kb3VibGUgbG9uZyBkb3VibGUKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIGxpbmVfY29lZmYgewoJcHVibGljOgogICAgICAgIGxsX2ludCBhLCBiOwogICAgICAgIGxfZG91YmxlIGM7CgoJCWxpbmVfY29lZmYobGxfaW50IHgsIGxsX2ludCB5LCBsX2RvdWJsZSB6KSB7CgkJCWlmKHggPCAwKSB7CgkJCQlhID0gLXg7CgkJCQliID0gLXk7CgkJCQljID0gLXo7CgkJCX0KCQkJZWxzZSB7CgkJCQlhID0geDsKCQkJCWIgPSB5OwoJCQkJYyA9IHo7CgkJCX0KCQkJbWluaW1pemVfY29lZmYoKTsKCQl9CgoJCWZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvciA8PCAob3N0cmVhbSYsIGxpbmVfY29lZmYpOwoKICAgICAgICBib29sIG9wZXJhdG9yIDwoY29uc3QgbGluZV9jb2VmZiYgcmhzKSBjb25zdCB7CiAgICAgICAgICAgIGlmKGE9PXJocy5hICYmIGI9PXJocy5iICYmIGM9PXJocy5jKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgYm9vbCBvcGVyYXRvciA+KGNvbnN0IGxpbmVfY29lZmYmIHJocykgY29uc3QgewogICAgICAgICAgICBpZihhPT1yaHMuYSAmJiBiPT1yaHMuYiAmJiBjPT1yaHMuYykgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBsbF9pbnQgZ2NkKGxsX2ludCB4LCBsbF9pbnQgeSkgewoJCQlpZigheSkgcmV0dXJuIHg7CgkJCXJldHVybiBnY2QoeSwgeCV5KTsKICAgICAgICB9CgogICAgICAgIHZvaWQgbWluaW1pemVfY29lZmYoKSB7CgkJCWxsX2ludCBnY2RfdmFsID0gZ2NkKGFicyhhKSwgYWJzKGIpKTsKCQkJYSAvPSBnY2RfdmFsOwoJCQliIC89IGdjZF92YWw7CgkJCWMgLz0gZ2NkX3ZhbDsKICAgICAgICB9Cn07Cgpvc3RyZWFtJiBvcGVyYXRvciA8PCAob3N0cmVhbSAmb3V0LCBsaW5lX2NvZWZmIGNvZWZmKSB7CglvdXQ8PGNvZWZmLmE8PCIgIjw8Y29lZmYuYjw8IiAiPDxjb2VmZi5jOwoJcmV0dXJuIG91dDsKfQoKaW50IG1haW4oKSB7CglzZXQ8bGluZV9jb2VmZj4gbGluZV9zZXQ7CiAgICBsbF9pbnQgdCwgbiwgYSwgYiwgYW5zLCBtYXhfeCwgbWF4X3ksIHByZXZfdmFsPTA7IGxfZG91YmxlIGM7CiAgICBtYXA8cGFpcjxsbF9pbnQsbGxfaW50PixsbF9pbnQ+IG07CiAgICBjaW4+PnQ7CiAgICB3aGlsZSh0LS0pIHsKCQlhbnMgPSAwOwoJCWNpbj4+bjsKCQltYXhfeCA9IG1heF95ID0gMDsKCQl3aGlsZShuLS0pIHsKCQkJbGxfaW50IHByZXZfc2l6ZSA9IGxpbmVfc2V0LnNpemUoKTsKCQkJY2luPj5hPj5iPj5jOwoJCQlsaW5lX3NldC5pbnNlcnQobGluZV9jb2VmZihhLCBiLCBjKSk7CgkJCWlmKGE9PTAgJiYgbGluZV9zZXQuc2l6ZSgpPnByZXZfc2l6ZSkgbWF4X3grKzsKCQkJaWYoYj09MCAmJiBsaW5lX3NldC5zaXplKCk+cHJldl9zaXplKSBtYXhfeSsrOwoJCX0KCQlmb3Ioc2V0PGxpbmVfY29lZmY+OjppdGVyYXRvciBpdD1saW5lX3NldC5iZWdpbigpOyBpdCE9bGluZV9zZXQuZW5kKCk7IGl0KyspCgkJCW1bbWFrZV9wYWlyKGl0LT5hLGl0LT5iKV0rKzsKCQlsbF9pbnQgbWF4X3ZhbCA9IDA7CgkJZm9yKG1hcDxwYWlyPGxsX2ludCxsbF9pbnQ+LGxsX2ludD46Oml0ZXJhdG9yIGl0PW0uYmVnaW4oKTsgaXQhPW0uZW5kKCk7IGl0KyspIHsKCQkJaWYoaXQtPnNlY29uZCA+IG1heF92YWwpIG1heF92YWwgPSBpdC0+c2Vjb25kOwoJCX0KCQlpZihtYXhfeD5tYXhfeSAmJiBtYXhfeD5tYXhfdmFsKSBhbnMgPSBtYXhfeDsKCQllbHNlIGlmKG1heF95Pm1heF94ICYmIG1heF95Pm1heF92YWwpIGFucyA9IG1heF95OwoJCWVsc2UgaWYobWF4X3ZhbD09MSAmJiBuIT0xKSBhbnMgPSAwOwoJCWVsc2UgYW5zID0gbWF4X3ZhbDsKCQljb3V0PDxhbnM8PGVuZGw7CgkJbGluZV9zZXQuY2xlYXIoKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==