#include "september.h"
#include "bits/stdc++.h"
using namespace std;
#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif
namespace {
int n, m;
const int maxn = 1e5 + 5;
int par[maxn];
vector<int> g[maxn];
int p[maxn][6];
int lt[maxn][6];
int ptr[6], nxt[6];
void dfs(int u) {
for (auto v : g[u]) {
dfs(v);
for (int c = 0; c < m; ++c) {
lt[u][c] = max(lt[u][c], lt[v][c]);
}
}
}
}
int solve(int N, int M, vector<int> F, vector<vector<int>> S) {
n = N, m = M;
for (int i = 1; i < n; ++i) {
par[i] = F[i];
}
for (int i = 0; i < n; ++i) {
g[i].clear();
}
for (int i = 0; i < m; ++i) {
for (int j = 1; j < n; ++j) p[j][i] = S[i][j - 1];
}
for (int i = 1; i < n; ++i) {
for (int j = 0; j < m; ++j) {
lt[p[i][j]][j] = i;
}
g[par[i]].push_back(i);
}
dfs(0);
debug(1000 * clock() / CLOCKS_PER_SEC);
int res = 0;
for (int i = 0; i < m; ++i) {
ptr[i] = 1;
nxt[i] = 1;
}
while (*min_element(ptr, ptr + m) < n) {
stack<int> st;
for (int i = 0; i < m; ++i) {
if (ptr[i] < n and ptr[i] <= nxt[i]) st.push(i);
}
while (!st.empty()) {
auto i = st.top(); st.pop();
while (ptr[i] < n and ptr[i] <= nxt[i]) {
int val = p[ptr[i]][i];
for (int j = 0; j < m; ++j) {
if (lt[val][j] > nxt[j]) {
nxt[j] = lt[val][j];
st.push(j);
}
}
++ptr[i];
}
}
bool ct = 1;
// for (int i = 0; i < m; ++i) {
// if (ptr[i] <= nxt[i] || ptr[i] != ptr[0]) {
// ct = 0;
// break;
// }
// }
if (ct) {
++res;
for (int i = 0; i < m; ++i) {
if (ptr[i] < n) {
nxt[i] = max(nxt[i], ptr[i]);
}
}
}
}
return res;
}
#ifdef duc_debug
void taskcase() {
int N, M;
cin >> N >> M;
std::vector<int> F(N);
F[0] = -1;
for (int i = 1; i < N; ++i)
cin >> F[i];
std::vector<std::vector<int>> S(M, std::vector<int>(N - 1));
for (int i = 0; i < M; ++i)
for (int j = 0; j < N - 1; ++j)
cin >> S[i][j];
printf("%d\n", solve(N, M, F, S));
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--) taskcase();
debug(1000 * clock() / CLOCKS_PER_SEC);
return 0;
}
#endif