#include <iostream>
#include<cstring>
using namespace std;
struct node
{
int l,w;
}dp[1005];
int g[1005][1005];
int d[1005];
int n,max_v;
int f(int i)
{
if (d[i]>0) return d[i];
d[i]=1;
for (int j=0;j<n;j++)
{
if (g[i][j])
d[i]=max(d[i],f(j)+1);
}
max_v=max(max_v,d[i]);
return d[i];
}
int main()
{
int N;
cin>>N;
while (N--)
{
cin>>n;
int x,y;
memset(g,0,sizeof(g));
for (int i=0;i<n;i++)
{
cin>>x>>y;
dp[i].l=max(x,y);
dp[i].w=min(x,y);
}
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
{
if (dp[i].l>dp[j].l && dp[i].w>dp[j].w) g[j][i]=1;
else if ( dp[i].l<dp[j].l && dp[i].w<dp[j].w ) g[i][j]=1;
else g[j][i]=g[i][j]=0;
}
d[i]=0;
}
max_v=0;
for (int i=0;i<n;i++)
f(i);
cout<<max_v<<endl;
}
return 0;
}
#include <iostream>
using namespace std;
struct node
{
int l,w;
}dp[1005];
int g[1005][1005];
int d[1005];
int k,max_v;
int f(int i)
{
if (d[i]>0) return d[i];
d[i]=1;
for (int j=0;j<k;j++)
{
if (g[i][j])
d[i]=max(d[i],f(j)+1);
}
max_v=max(max_v,d[i]);
return d[i];
}
int main()
{
int n;
cin>>n;
while (n--)
{
cin>>k;
int x,y;
for (int i=0;i<k;i++)
{
cin>>x>>y;
dp[i].l=max(x,y);
dp[i].w=min(x,y);
}
for (int i=0;i<k;i++)
{
for (int j=i+1; j<k; j++)
{
if (dp[i].l>dp[j].l && dp[i].w>dp[j].w)
{
g[j][i]=1;
g[i][j]=0;
}
else if (dp[i].l<dp[j].l && dp[i].w<dp[j].w)
{
g[j][i]=0;
g[i][j]=1;
}
else g[j][i]=g[i][j]=0;
}
d[i]=0;
}
max_v=0;
for (int i=0;i<k;i++)
f(i);
cout<<max_v<<endl;
}
return 0;
}