#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 4e5 + 10;
const int INF = 1<<29;
char s[maxn]; //因为二维数组保存不下这么大,用一维数组来当做二维数组
int f[maxn], g[maxn]; //f用来保存每行的*总数, g用来表示每列x的*总数
int q, n, m;
int main(void) {
scanf("%d", &q);
while(q--) {
memset(f, 0, sizeof(int)*n);
memset(g, 0, sizeof(int)*m);
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%s", s + i*m); //很巧妙的转化成了二维数组,一维当二维用
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
f[i] += (s[i*m+j] == '*'); //i*m表示第几行,加上j表示第i行j列,统计行的*总数
g[j] += (s[i*m+j] == '*'); //同上统计第j列的*总数
}
}
int ans = INF;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans = min(ans, m-f[i] + n-g[j] - (s[i*m+j] == '.')); //m-f[i]表示第i行把.都改为*的次数,
//n-g[j]表示第j列把.改为*的总次数
//如果(i,j)是.那么要减去重复的.一次,反之(i,j)是*那么就不用改变
}
}
printf("%d\n", ans);
}
return 0;
}