#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
int m, n;
int dx[4] = {0,-1,0,1};
int dy[4] = {-1,0,1,0};
int dxx[8] = {0,-1,0,1,-1,-1,1,1};
int dyy[8] = {-1,0,1,0,-1,1,-1,1};
int res = 0;
void dfs_road(vector<vector<char>> &grid,int x,int y,vector<vector<bool>> &visited)
{
visited[x][y] = true;
for(int i = 0;i < 4;i++)
{
int nextx = x + dx[i];
int nexty = y + dy[i];
if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
if(!visited[nextx][nexty] && grid[nextx][nexty] == '1')
{
visited[nextx][nexty] = true;
dfs_road(grid,nextx,nexty,visited);
}
}
}
//
void dfs_sea(vector<vector<char>> &grid,int x,int y,vector<vector<bool>> &visited)
{
visited[x][y] = true;
for(int i = 0;i < 8;i++)
{
int nextx = x + dxx[i];
int nexty = y + dyy[i];
if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
if(!visited[nextx][nexty] && grid[nextx][nexty] == '1')
{
visited[nexty][nexty] = true;
dfs_road(grid,nextx,nexty,visited);
res++;
}
if(!visited[nextx][nexty] && grid[nextx][nexty] == '0')
{
visited[nextx][nexty] = true;
dfs_sea(grid,nextx,nexty,visited);
}
}
}
void solve()
{
cin >> m >>n;
res = 0;
vector<vector<char>> grid(m,vector<char>(n));
vector<vector<bool>> visited = vector<vector<bool>>(m,vector<bool>(n,false));
for(int i = 0;i < m;i++)
{
for(int j = 0;j < n;j++)
{
cin >> grid[i][j];
}
}
//从边缘遍历岛屿
for(int i = 0;i < m;i++)
{
if(!visited[i][0] && grid[i][0] == '1')
{
dfs_road(grid,i,0,visited);
res++;
}
if(!visited[i][n - 1] && grid[i][n - 1] == '1')
{
dfs_road(grid,i,n - 1,visited);
res++;
}
}
for(int j = 0;j < n;j++)
{
if(!visited[0][j] && grid[0][j] == '1')
{
dfs_road(grid,0,j,visited);
res++;
}
if(!visited[m - 1][j] && grid[m - 1][j] == '1')
{
dfs_road(grid,m - 1,j,visited);
res++;
}
}
//从边缘的海遍历 遇见没有遍历过的陆地再做dfs
for(int i = 0;i < m;i++)
{
if(!visited[i][0] && grid[i][0] == '0')
{
dfs_sea(grid,i,0,visited);
}
//
if(!visited[i][n - 1] && grid[i][n - 1] == '0')
{
dfs_sea(grid,i,n - 1,visited);
}
}
for(int j = 0;j < n;j++)
{
if(!visited[0][j] && grid[0][j] == '0')
{
dfs_sea(grid,0,j,visited);
}
//
if(!visited[m - 1][j] && grid[m - 1][j] == '0')
{
dfs_sea(grid,m - 1,j,visited);
}
}
cout << res << endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while(t--)
solve();
return 0;
}