// i wants to take ioi
//binhtinhtutinkhongcaycunhungmotkhikhongcontutinnualatuyetvong
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nn "\n"
#define pi pair<int, int>
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define eb emplace_back
#define pb push_back
#define TASK " "
#define ms(a, x) memset(a, x, sizeof(a))
#define all(a) a.begin(), a.end()
#define All(a, n) a + 1, a + 1 + n
#define LOG 19
const int INF = 1e18;
const int mod = 1e9;
const int N = 20 + 5;
int MOD = 998244353;
int bit[200000];
struct node{
int kc, u, hk;
bool operator<(const node& other) const {
return kc > other.kc;
}
};
struct edge{
int v, w, h;
};
void nhap(){
}
char a[N][N];
bool vis[N][N];
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};
int m, n;
bool bfs(int sx, int sy){
queue<pi> q;
q.push({sx, sy});
vis[sx][sy] = 1;
while(!q.empty()){
int u = q.front().fi, v = q.front().se;
q.pop();
if((u == 1 || u == m || v == 1 || v == n) && a[u][v] == '.' && (u != sx || v != sy)){
return 1;
}
for(int i = 0; i < 4; i++){
int x = u + dx[i];
int y = v + dy[i];
if(x < 1 || y < 1 || x > m || y > n || a[x][y] == '#') continue;
if(!vis[x][y]){
vis[x][y] = 1;
q.push({x, y});
}
}
}
return 0;
}
void solve(){
cin >> m >> n;
for(int i = 1; i <= m; i++){
for(int j= 1; j <= n; j++){
cin >> a[i][j];
vis[i][j] = 0;
}
}
bool ok = 0;
vector<pi> v;
for(int i = 1; i <= m; i++){
if(a[i][1] == '.'){
v.eb(i, 1);
}
if(a[i][n] == '.'){
v.eb(i, n);
}
}
for(int i = 1; i <= n; i++){
if(a[1][i] == '.'){
v.eb(1, i);
}
if(a[m][i] == '.'){
v.eb(m, i);
}
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
if(v.size() == 2){
if(bfs(v[0].fi, v[0].se)){
cout << "valid" << nn;
}
else cout << "invalid" << nn;
}
else cout << "invalid" << nn;
}
signed main() {
// freopen("m_mu_n.inp", "r", stdin);
// freopen("m_mu_n.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t; cin >> t;
while(t--) solve();
return (0 ^ 0);
}
Ly8gaSB3YW50cyB0byB0YWtlIGlvaQovL2Jpbmh0aW5odHV0aW5raG9uZ2NheWN1bmh1bmdtb3RraGlraG9uZ2NvbnR1dGlubnVhbGF0dXlldHZvbmcKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgbm4gIlxuIgojZGVmaW5lIHBpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBsYiBsb3dlcl9ib3VuZAojZGVmaW5lIHViIHVwcGVyX2JvdW5kCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgVEFTSyAiICIKCiNkZWZpbmUgbXMoYSwgeCkgbWVtc2V0KGEsIHgsIHNpemVvZihhKSkKI2RlZmluZSBhbGwoYSkgYS5iZWdpbigpLCBhLmVuZCgpCiNkZWZpbmUgQWxsKGEsIG4pIGEgKyAxLCBhICsgMSArIG4KCiNkZWZpbmUgTE9HIDE5CgoKY29uc3QgaW50IElORiA9IDFlMTg7CmNvbnN0IGludCBtb2QgPSAxZTk7CmNvbnN0IGludCBOID0gMjAgICsgNTsKaW50IE1PRCA9IDk5ODI0NDM1MzsKaW50IGJpdFsyMDAwMDBdOwpzdHJ1Y3Qgbm9kZXsKCWludCBrYywgdSwgaGs7Cglib29sIG9wZXJhdG9yPChjb25zdCBub2RlJiBvdGhlcikgY29uc3QgewogICAgICAgIHJldHVybiBrYyA+IG90aGVyLmtjOwogICAgfQp9OwpzdHJ1Y3QgZWRnZXsKCWludCB2LCB3LCBoOwp9OwoKdm9pZCBuaGFwKCl7Cgp9CmNoYXIgYVtOXVtOXTsKYm9vbCB2aXNbTl1bTl07CmludCBkeFtdID0gezAsIDAsIC0xLCAxfTsKaW50IGR5W10gPSB7MSwgLTEsIDAsIDB9OwppbnQgbSwgbjsKYm9vbCBiZnMoaW50IHN4LCBpbnQgc3kpewogICAgcXVldWU8cGk+IHE7CiAgICBxLnB1c2goe3N4LCBzeX0pOwogICAgdmlzW3N4XVtzeV0gPSAxOwogICAgd2hpbGUoIXEuZW1wdHkoKSl7CiAgICAgICAgaW50IHUgPSBxLmZyb250KCkuZmksIHYgPSBxLmZyb250KCkuc2U7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICBpZigodSA9PSAxIHx8IHUgPT0gbSB8fCB2ID09IDEgfHwgdiA9PSBuKSAmJiBhW3VdW3ZdID09ICcuJyAmJiAodSAhPSBzeCB8fCB2ICE9IHN5KSl7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKXsKICAgICAgICAgICAgaW50IHggPSB1ICsgZHhbaV07CiAgICAgICAgICAgIGludCB5ID0gdiArIGR5W2ldOwogICAgICAgICAgICBpZih4IDwgMSB8fCB5IDwgMSB8fCB4ID4gbSB8fCB5ID4gbiB8fCBhW3hdW3ldID09ICcjJykgY29udGludWU7CiAgICAgICAgICAgIGlmKCF2aXNbeF1beV0pewogICAgICAgICAgICAgICAgdmlzW3hdW3ldID0gMTsKICAgICAgICAgICAgICAgIHEucHVzaCh7eCwgeX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0Kdm9pZCBzb2x2ZSgpewogICAgY2luID4+IG0gPj4gbjsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKXsKICAgICAgICBmb3IoaW50IGo9IDE7IGogPD0gbjsgaisrKXsKICAgICAgICAgICAgY2luID4+IGFbaV1bal07CiAgICAgICAgICAgIHZpc1tpXVtqXSA9IDA7CiAgICAgICAgfQogICAgfQogICAgYm9vbCBvayA9IDA7CiAgICB2ZWN0b3I8cGk+IHY7CgogICAgZm9yKGludCBpID0gMTsgaSA8PSBtOyBpKyspewogICAgICAgIGlmKGFbaV1bMV0gPT0gJy4nKXsKICAgICAgICAgICAgdi5lYihpLCAxKTsKICAgICAgICB9CiAgICAgICAgaWYoYVtpXVtuXSA9PSAnLicpewogICAgICAgICAgICB2LmViKGksIG4pOwogICAgICAgIH0KICAgIH0KICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKXsKICAgICAgICBpZihhWzFdW2ldID09ICcuJyl7CiAgICAgICAgICAgIHYuZWIoMSwgaSk7CiAgICAgICAgfQogICAgICAgIGlmKGFbbV1baV0gPT0gJy4nKXsKICAgICAgICAgICAgdi5lYihtLCBpKTsKICAgICAgICB9CiAgICB9CiAgICBzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSk7CiAgICB2LmVyYXNlKHVuaXF1ZSh2LmJlZ2luKCksIHYuZW5kKCkpLCB2LmVuZCgpKTsKICAgIGlmKHYuc2l6ZSgpID09IDIpewogICAgICAgIGlmKGJmcyh2WzBdLmZpLCB2WzBdLnNlKSl7CiAgICAgICAgICAgIGNvdXQgPDwgInZhbGlkIiA8PCBubjsKICAgICAgICB9CiAgICAgICAgZWxzZSBjb3V0IDw8ICJpbnZhbGlkIiA8PCBubjsKICAgIH0KICAgIGVsc2UgY291dCA8PCAiaW52YWxpZCIgPDwgbm47Cgp9CnNpZ25lZCBtYWluKCkgewovLwkgZnJlb3BlbigibV9tdV9uLmlucCIsICJyIiwgc3RkaW4pOwovLwkgZnJlb3BlbigibV9tdV9uLm91dCIsICJ3Iiwgc3Rkb3V0KTsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOwoJY291dC50aWUoMCk7CglpbnQgdDsgY2luID4+IHQ7CiAgICB3aGlsZSh0LS0pIHNvbHZlKCk7CglyZXR1cm4gKDAgXiAwKTsKCn0K