#include using namespace std; const int MAXN = (int) 1e5 + 5; int n, card_cnt; int cnt[MAXN]; bool dp[MAXN][5][5][2]; bool dp2[MAXN][5][5][2]; int main() { int case_cnt; scanf("%d", &case_cnt); while (case_cnt--) { scanf("%d%d", &n, &card_cnt); for (int i = 0; i <= n + 1; ++i) { cnt[i] = 0; memset(dp[i], 0, sizeof dp[i]); memset(dp2[i], 0, sizeof dp2[i]); } for (int i = 1; i <= 3 * card_cnt + 1; ++i) { int x; scanf("%d", &x); ++cnt[x]; } dp[0][0][0][0] = true; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= 4; ++j) { for (int k = 0; k <= 4; ++k) { if (cnt[i] < j + k) { continue; } dp[i][k][cnt[i] - j - k][0] |= dp[i - 1][j][k][0]; dp[i][k][cnt[i] - j - k][1] |= dp[i - 1][j][k][1]; if (cnt[i] - j - k >= 2) { dp[i][k][cnt[i] - j - k - 2][1] |= dp[i - 1][j][k][0]; } if (cnt[i] - j - k >= 3) { dp[i][k][cnt[i] - j - k - 3][0] |= dp[i - 1][j][k][0]; dp[i][k][cnt[i] - j - k - 3][1] |= dp[i - 1][j][k][1]; } } } } dp2[n + 1][0][0][0] = true; for (int i = n; i >= 1; --i) { for (int j = 0; j <= 4; ++j) { for (int k = 0; k <= 4; ++k) { if (cnt[i] < j + k) { continue; } dp2[i][k][cnt[i] - j - k][0] |= dp2[i + 1][j][k][0]; dp2[i][k][cnt[i] - j - k][1] |= dp2[i + 1][j][k][1]; if (cnt[i] - j - k >= 2) { dp2[i][k][cnt[i] - j - k - 2][1] |= dp2[i + 1][j][k][0]; } if (cnt[i] - j - k >= 3) { dp2[i][k][cnt[i] - j - k - 3][0] |= dp2[i + 1][j][k][0]; dp2[i][k][cnt[i] - j - k - 3][1] |= dp2[i + 1][j][k][1]; } } } } int ans = 0; for (int i = 1; i <= n; ++i) { ++cnt[i]; bool flag = false; for (int j1 = 0; j1 <= 4; ++j1) { for (int j2 = 0; j2 <= 4; ++j2) { for (int k = 0; k <= 4; ++k) { if (cnt[i] < j1 + j2 + k) { continue; } if ((cnt[i] - j1 - j2 - k) % 3 == 0 && ((dp[i - 1][j1][k][1] && dp2[i + 1][j2][k][0]) || (dp[i - 1][j1][k][0] && dp2[i + 1][j2][k][1]))) { flag = true; break; } if ((cnt[i] - j1 - j2 - k - 2) % 3 == 0 && dp[i - 1][j1][k][0] && dp2[i + 1][j2][k][0]) { flag = true; break; } } } } --cnt[i]; if (flag) { ++ans; } } printf("%d\n", ans); } return 0; }