#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#define it map<ll,ll>::iterator
using namespace std;
typedef long long ll;
// 3 4 5 6 7 8 9 10 11 12 13 1 2 01 02
ll T,n,x,y,ans=1e9+7;
map<ll,ll> m;
void dfs(ll s){
ll k=0;
if(s>=ans)return ;
for(int i=1;i<=12;i++){//1shun
if(!m[i])k=0;
else {
k++;
if(k>=5){
for(int j=i;j>=i-k+1;j--)m[j]--;
dfs(s+1);
for(int j=i;j>=i-k+1;j--)m[j]++;
}
}
}
k=0;
for(int i=1;i<=12;i++){//2shun
if(m[i]<2)k=0;
else {
k++;
if(k>=3){
for(int j=i;j>=i-k+1;j--)m[j]-=2;
dfs(s+1);
for(int j=i;j>=i-k+1;j--)m[j]+=2;
}
}
}
k=0;
for(int i=1;i<=12;i++){//3shun
if(m[i]<3)k=0;
else {
k++;
if(k>=2){
for(int j=i;j>=i-k+1;j--)m[j]-=3;
dfs(s+1);
for(int j=i;j>=i-k+1;j--)m[j]+=3;
}
}
}
for(int i=1;i<=13;i++){
if(m[i]<=3){
if(m[i]<=2) continue;
m[i]-=3;
for(int j=1;j<=14;j++){
if(m[j]<=0||j==i) continue;
m[j]--;
dfs(x+1);
m[j]++;
}
for(int j=1;j<=13;j++){
if(m[j]<=1||j==i)continue;
m[j]-=2;
dfs(x+1);
m[j]+=2;
}
m[i]+=3;
}
else{
m[i]-=3;
for(int j=1;j<=14;j++){
if(m[j]<=0||j==i) continue;
m[j]--;
dfs(x+1);
m[j]++;
}
for(int j=1;j<=13;j++){
if(m[j]<=1||j==i) continue;
m[j]-=2;
dfs(x+1);
m[j]+=2;
}
m[i]+=3;
m[i]-=4;
for(int j=1;j<=14;j++){
if(m[j]<=0||j==i) continue;
m[j]--;
for (int k=1;k<=14;k++){
if(m[k]<=0||j==k) continue;
m[k]--;
dfs(x+1);
m[k]++;
}
m[j]++;
}
for(int j=1;j<=13;j++){
if(m[j]<=1||j==i) continue;
m[j]-=2;
for(int k=1;k<=13;k++) {
if(m[k]<=1||j==k) continue;
m[k]-=2;
dfs(x+1);
m[k]+=2;
}
m[j]+=2;
}
m[i]+=4;
}
}
for(int i=1;i<=14;i++){
if(m[i])s++;
}
// for(int i=1;i<=14;i++){
// cout<<m[i]<<" ";
// }cout<<endl<<s<<" "<<ans<<endl;
ans=min(s,ans);
return ;
}
int main(){
cin>>T>>n;
while(T--){
ans=1e9+7;
for(int i=1;i<=n;i++){
cin>>x>>y;
if(x==0)m[14]++;
else if(x==1||x==2)m[x+11]++;
else m[x-2]++;
}
dfs(0);
cout<<ans<<endl;
m.clear();
}
return 0;
}
第二个样例都过不去,但感觉好像没问题