#include <bits/stdc++.h>
using namespace std;
#define int long long
#define dd double
#define ld long double
#define ull unsigned long long
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define el "\n"
#define Arwa ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define fix(x) cout << fixed << setprecision(x)
#define all(v) v.begin(),v.end()
#define dpp(v,val) memset(v,val,sizeof(v))
#define mod 1e9+7
#define oo 1e9
const int N = 1e5 + 5;
int n,m;
vector<vector<int>>v;
map<pair<int,int>,bool>mp;
int dp[1003][1003];
bool valid(int i,int j)
{
if(mp[{i,j}]==1) return false;
return (i>=1&&i<=n&&j>=1&&j<=m);
}
int solve(int i,int j)
{
if(!valid(i,j)) return 0;
int& ret =dp[i][j];
if(ret!=-1) return ret;
if(i==n&&j==m) return 1;
ret=solve(i,j+1)+solve(i+1,j);
return ret;
}
void HereWeGoAgain()
{
mp.clear();
cin>>n>>m;
cin.ignore();
v.resize(n);
for(int i=0;i<n;i++)
{
int x;
string s;
getline(cin,s);
vector<int>v;
stringstream ss(s);
while(ss>>x)
v.push_back(x);
for(int j=1;j<v.size();j++) mp[{v[0],v[j]}]=1;
}
dpp(dp,-1);
//for(auto it:mp) if(it.second) cout<<it.first.first<<' '<<it.first.second<<el;
cout<<solve(1,1);
}
int32_t main()
{
Arwa
int t=1;
cin>>t;
for(int i=1;i<=t;i++)
{
HereWeGoAgain();
if(i!=t) cout<<el<<el;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGRkIGRvdWJsZQojZGVmaW5lIGxkIGxvbmcgZG91YmxlCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwojZGVmaW5lIHllcyBjb3V0IDw8ICJZRVNcbiIKI2RlZmluZSBubyBjb3V0IDw8ICJOT1xuIgojZGVmaW5lIGVsICJcbiIKI2RlZmluZSBBcndhIGlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2RlZmluZSBmaXgoeCkgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oeCkKI2RlZmluZSBhbGwodikgdi5iZWdpbigpLHYuZW5kKCkKI2RlZmluZSBkcHAodix2YWwpIG1lbXNldCh2LHZhbCxzaXplb2YodikpCiNkZWZpbmUgbW9kIDFlOSs3CiNkZWZpbmUgb28gMWU5CmNvbnN0IGludCBOID0gMWU1ICsgNTsKaW50IG4sbTsKdmVjdG9yPHZlY3RvcjxpbnQ+PnY7Cm1hcDxwYWlyPGludCxpbnQ+LGJvb2w+bXA7CmludCBkcFsxMDAzXVsxMDAzXTsKYm9vbCB2YWxpZChpbnQgaSxpbnQgaikKewogICAgaWYobXBbe2ksan1dPT0xKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gKGk+PTEmJmk8PW4mJmo+PTEmJmo8PW0pOwp9CmludCBzb2x2ZShpbnQgaSxpbnQgaikKewogIGlmKCF2YWxpZChpLGopKSByZXR1cm4gMDsKICBpbnQmIHJldCA9ZHBbaV1bal07CiAgaWYocmV0IT0tMSkgcmV0dXJuIHJldDsKICBpZihpPT1uJiZqPT1tKSByZXR1cm4gMTsKICByZXQ9c29sdmUoaSxqKzEpK3NvbHZlKGkrMSxqKTsKICByZXR1cm4gcmV0Owp9CnZvaWQgSGVyZVdlR29BZ2FpbigpCnsKICAgIG1wLmNsZWFyKCk7CiAgICBjaW4+Pm4+Pm07CiAgICBjaW4uaWdub3JlKCk7CiAgICB2LnJlc2l6ZShuKTsKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICB7CiAgICAgICAgaW50IHg7CiAgICAgICAgc3RyaW5nIHM7CiAgICAgICAgZ2V0bGluZShjaW4scyk7CiAgICAgICAgdmVjdG9yPGludD52OwogICAgICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsKICAgICAgICB3aGlsZShzcz4+eCkKICAgICAgICB2LnB1c2hfYmFjayh4KTsKICAgICAgICBmb3IoaW50IGo9MTtqPHYuc2l6ZSgpO2orKykgbXBbe3ZbMF0sdltqXX1dPTE7CiAgICB9CiAgICBkcHAoZHAsLTEpOwogICAgLy9mb3IoYXV0byBpdDptcCkgaWYoaXQuc2Vjb25kKSBjb3V0PDxpdC5maXJzdC5maXJzdDw8JyAnPDxpdC5maXJzdC5zZWNvbmQ8PGVsOwogICAgY291dDw8c29sdmUoMSwxKTsKfQppbnQzMl90IG1haW4oKSAKewogICAgQXJ3YQogICAgaW50IHQ9MTsKICAgIGNpbj4+dDsKICAgIGZvcihpbnQgaT0xO2k8PXQ7aSsrKQogICAgewogICAgSGVyZVdlR29BZ2FpbigpOwogICAgaWYoaSE9dCkgY291dDw8ZWw8PGVsOwogICAgfQogICAgcmV0dXJuIDA7Cn0g