#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ll long long int
#define endl '\n'
typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds; // find_by_order, order_of_key
#define all(v) v.begin(), v.end()
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
#define M 1000000007
#define lcm(a, b) a *b / gcd(a, b)
#define memz(a) memset(a, 0, sizeof(a))
#define memn(a) memset(a, -1, sizeof(a))
ll dx[]={1,0,-1,0,1,-1,-1,1};
ll dy[]={0,1,0,-1,1,1,-1,-1};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
ll tst;
cin>>tst;
for(ll test=1;test<=tst;test++)
{
//cout<<"Case "<<test<<": ";
ll n,m;
cin>>n>>m;
map<char,ll>mp[m];
string in[n];
ll mx[m]={0};
ll fmx[n]={0};
for(int i=0;i<n;i++)
{
cin>>in[i];
ll c=0;
for(int j=0;j<m;j++)
{
mp[j][in[i][j]]++;
mx[j]=max(mx[j],mp[j][in[i][j]]);
c+=mx[j];
}
fmx[i]=c;
}
map<char,ll>mp1[m];
ll mx1[m]={0};
ll bmx[n]={0};
for(int i=n-1;i>=0;i--)
{
ll c=0;
for(int j=0;j<m;j++)
{
mp1[j][in[i][j]]++;
mx1[j]=max(mx1[j],mp1[j][in[i][j]]);
c+=mx1[j];
}
bmx[i]=c;
}
ll ans=max(fmx[n-1],bmx[0]);
for(int i=0;i<n-1;i++)
{
ans=max(ans,fmx[i]+bmx[i+1]);
}
cout<<ans<<endl;
// cout<<ans<<endl;
// for(int i=0;i<n;i++)cout<<fmx[i]<<" ";
// cout<<endl;
// for(int i=0;i<n;i++)cout<<bmx[i]<<" ";
}
}