#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int j,n,m,t,x,y,s[500][500];
long long f[500][500];//一定要记得开long long,否则。。。
int kk=998244353;
int check(int a,int b,int c,int d)
{
return (s[c][d]-s[c][b-1]-s[a-1][d]+s[a-1][b-1]);
}
void work()
{
memset(s,0,sizeof(s));//记得清空
memset(f,0,sizeof(f));
cin>>n>>m;
for (int i=1;i<=m;i++)
{
cin>>x>>y;
s[x][y]=1;//记录对应的关系
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
s[i][j]=s[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];//矩阵前缀和
for (int i=1;i<=n;i++)
if (check(i,i,i,i)==1)//如果自身对自身有所限制的话,那么这种情况是不存在的,可以直接输出0.
{
printf("0\n");
return;
}
for (int i=1;i<=n;i++) f[i][i]=1;//构成单个括号的可能性只有一种
for (int len=2;len<=n;len++)
for (int i=1;i<=n-len+1;i++)
{
j=i+len-1;
if (check(i,i+1,i,j)==0) f[i][j]=(f[i][j]+f[i+1][j])%kk;
if (check(i+1,i,j,i)==0) f[i][j]=(f[i][j]+f[i+1][j])%kk;
for (int k=i+1;k<=j-1;k++)
if ((check(k+1,i,j,k)==0)&&(check(i,i+1,i,k)==0))
f[i][j]=(f[i][j]+f[i+1][k]*f[k+1][j]%kk)%kk;//这个程序中解释过了
}
cout<<f[1][n]<<endl;
}
int main()
{
cin>>t;
for (int i=1;i<=t;i++) //多组输入数据
work();
return 0;
}