// Authored by Ibrahimfostok...
// Next level : "Master"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
// const ll mod = 1e9 + 7;
#define gcd __gcd
#define int ll
#define ld long double
#define lcm(a, b) (a * b / gcd(a, b))
#define ceil(x, y) (((x) + (y) - 1ll) / (y))
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define MOD(x) x = ((x % mod) + mod) % mod
const long double pi = 3.14159265358979323846;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll rand(ll L, ll R)
{
return uniform_int_distribution<ll>(L, R)(rng);
}
//
void My_Solve(int TC)
{
// cout << setprecision(10) << fixed;
int n, m, ans = 0;
cin >> n >> m;
vector<string> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
map<pair<int, int>, bool> vis;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (!vis[{i, j}] && a[i][j] == '0')
{
queue<pair<int, int>> q;
q.push({i, j}), vis[{i, j}] = 1;
int here = 0;
while (!q.empty())
{
auto x = q.front();
here++, q.pop();
if (x.first && a[x.first - 1][x.second] == '0' && !vis[{x.first - 1, x.second}])
q.push({x.first - 1, x.second}), vis[{x.first - 1, x.second}] = 1;
if (x.first + 1 < n && a[x.first + 1][x.second] == '0' && !vis[{x.first + 1, x.second}])
q.push({x.first + 1, x.second}), vis[{x.first + 1, x.second}] = 1;
if (x.second && a[x.first][x.second - 1] == '0' && !vis[{x.first, x.second - 1}])
q.push({x.first, x.second - 1}), vis[{x.first, x.second - 1}] = 1;
if (x.second + 1 < m && a[x.first][x.second + 1] == '0' && !vis[{x.first, x.second + 1}])
q.push({x.first, x.second + 1}), vis[{x.first, x.second + 1}] = 1;
}
ans = max(ans, here);
}
cout << "Floor #" << TC << ": " << ans << '\n';
}
int32_t main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
int t = 1;
cin >> t;
for (int i = 1; i <= t; i++)
My_Solve(i);
return 0;
}