#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 8000<<1;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mid int m = (l + r)>>1
int n;
int col[maxn<<2];
int vis[maxn<<2];
vector<int> ans[maxn];
struct node
{
int y1, y2, x;
}p[maxn];
bool cmp(node a, node b)
{
return a.x < b.x;
}
void pushdown(int rt)
{
if(col[rt])
{
col[rt<<1] = col[rt<<1|1] = col[rt];
col[rt] = 0;
}
}
void query(int L, int R, int v, int l, int r, int rt)
{
if(col[rt])
{
if(vis[col[rt]] != v)
{
vis[col[rt]] = v;
ans[col[rt]].push_back(v);
}
return;
}
if(l == r) return;
mid;
if(L <= m) query(L, R, v, lson);
if(R > m) query(L, R, v, rson);
}
void update(int L, int R, int v, int l, int r, int rt)
{
if(L <= l && r <= R)
{
col[rt] = v;
return;
}
pushdown(rt);
mid;
if(L <= m) update(L, R, v, lson);
if(R > m) update(L, R, v, rson);
}
void debug()
{
int i, j;
for(i = 1; i <= n; i++)
{
printf("%d : ", i);
for(j = 0 ; j < ans[i].size(); j++)
printf("%d ", ans[i][j]);
puts("");
}
}
int main()
{
int i, j, cas;
scanf("%d", &cas);
while(cas--)
{
scanf("%d", &n);
for(i = 1; i <= n; i++)
ans[i].clear();
memset(col, 0, sizeof(col));
memset(vis, 0, sizeof(vis));
for(i = 1; i <= n; i++)
scanf("%d%d%d", &p[i].y1, &p[i].y2, &p[i].x);
sort(p+1, p+n+1, cmp);
for(i = 1; i <= n; i++)
{
p[i].y1 <<= 1; p[i].y2 <<= 1;
query(p[i].y1, p[i].y2, i, 0, maxn-1, 1);
update(p[i].y1, p[i].y2, i, 0, maxn-1, 1);
}
int cnt = 0;
// debug();
for(i = 1; i <= n; i++)
for(j = 0; j < ans[i].size(); j++)
{
int u = ans[i][j];
for(int x = 0; x < ans[i].size(); x++)
for(int y = 0; y < ans[u].size(); y++)
if(ans[i][x] == ans[u][y])
cnt++;
}
printf("%d\n", cnt);
}
return 0;
}