#define CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define ordered_set tree<pair<ll,ll>, null_type, less <pair<ll,ll>>, rb_tree_tag, tree_order_statistics_node_update>
#define ll long long
#define all(name) name.begin(),name.end()
#define rall(name) name.rbegin(),name.rend()
#define sz(s) (int)s.size()
const int N = 2e6 + 10, mod = 1e9 + 7;
const double PI = asin(1.0) * 2;
const int OO = 0x3f3f3f3f;
int dx[]{1, -1, 0, 0, 1, 1, -1, -1};
int dy[]{0, 0, 1, -1, 1, -1, 1, -1};
void fast() {
std::ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
map<string, bool> mp;
bool isWin(string s) {
return (
// row
(s[0] != '.' && s[0] == s[1] && s[0] == s[2]) ||
(s[3] != '.' && s[3] == s[4] && s[3] == s[5]) ||
(s[6] != '.' && s[6] == s[7] && s[6] == s[8]) ||
// col
(s[0] != '.' && s[0] == s[3] && s[0] == s[6]) ||
(s[1] != '.' && s[1] == s[4] && s[1] == s[7]) ||
(s[2] != '.' && s[2] == s[5] && s[2] == s[8]) ||
// diag
(s[0] != '.' && s[0] == s[4] && s[0] == s[8]) ||
(s[0] != '.' && s[2] == s[4] && s[2] == s[6])
);
}
void bfs(string s = ".........") {
queue<pair<string, bool>> q; // grid, player( X --> 1, O --> 0)
q.push({s, 1});
while (!q.empty()) {
pair<string, bool> p = q.front();
q.pop();
string grid = p.first;
for (int i = 0; i < 9; i++) {
if (grid[i] == '.') {
if (p.second) grid[i] = 'X'; else grid[i] = 'O';
if (!isWin(grid))
q.push({grid, p.second ^ 1});
if (isWin(grid))
mp[grid] = 1;
grid[i] = '.';
}
}
}
}
void solve() {
string s;
bfs();
while (cin >> s) {
if (s == "end")
break;
cout << (mp[s] ? "valid\n" : "invalid\n");
}
}
int main() {
fast();
//freopen("abc.in", "r", stdin);
//freopen("output.txt", "w", stdout);
int T = 1;
//cin >> T;
while (T--) {
solve();
}
return 0;
}
I2RlZmluZSBDUlRfU0VDVVJFX05PX1dBUk5JTkdTCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KCnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiBsb25nIGRvdWJsZSBsZDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwojZGVmaW5lIG9yZGVyZWRfc2V0IHRyZWU8cGFpcjxsbCxsbD4sIG51bGxfdHlwZSwgbGVzcyA8cGFpcjxsbCxsbD4+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGFsbChuYW1lKSAgbmFtZS5iZWdpbigpLG5hbWUuZW5kKCkKI2RlZmluZSByYWxsKG5hbWUpICBuYW1lLnJiZWdpbigpLG5hbWUucmVuZCgpCiNkZWZpbmUgc3oocykgKGludClzLnNpemUoKQpjb25zdCBpbnQgTiA9IDJlNiArIDEwLCBtb2QgPSAxZTkgKyA3Owpjb25zdCBkb3VibGUgUEkgPSBhc2luKDEuMCkgKiAyOwpjb25zdCBpbnQgT08gPSAweDNmM2YzZjNmOwppbnQgZHhbXXsxLCAtMSwgMCwgMCwgMSwgMSwgLTEsIC0xfTsKaW50IGR5W117MCwgMCwgMSwgLTEsIDEsIC0xLCAxLCAtMX07Cgp2b2lkIGZhc3QoKSB7CiAgICBzdGQ6Omlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7Cn0KCm1hcDxzdHJpbmcsIGJvb2w+IG1wOwoKYm9vbCBpc1dpbihzdHJpbmcgcykgewogICAgcmV0dXJuICgKICAgICAgICAgICAgLy8gcm93CiAgICAgICAgICAgIChzWzBdICE9ICcuJyAmJiBzWzBdID09IHNbMV0gJiYgc1swXSA9PSBzWzJdKSB8fAogICAgICAgICAgICAoc1szXSAhPSAnLicgJiYgc1szXSA9PSBzWzRdICYmIHNbM10gPT0gc1s1XSkgfHwKICAgICAgICAgICAgKHNbNl0gIT0gJy4nICYmIHNbNl0gPT0gc1s3XSAmJiBzWzZdID09IHNbOF0pIHx8CiAgICAgICAgICAgIC8vIGNvbAogICAgICAgICAgICAoc1swXSAhPSAnLicgJiYgc1swXSA9PSBzWzNdICYmIHNbMF0gPT0gc1s2XSkgfHwKICAgICAgICAgICAgKHNbMV0gIT0gJy4nICYmIHNbMV0gPT0gc1s0XSAmJiBzWzFdID09IHNbN10pIHx8CiAgICAgICAgICAgIChzWzJdICE9ICcuJyAmJiBzWzJdID09IHNbNV0gJiYgc1syXSA9PSBzWzhdKSB8fAogICAgICAgICAgICAvLyBkaWFnCiAgICAgICAgICAgIChzWzBdICE9ICcuJyAmJiBzWzBdID09IHNbNF0gJiYgc1swXSA9PSBzWzhdKSB8fAogICAgICAgICAgICAoc1swXSAhPSAnLicgJiYgc1syXSA9PSBzWzRdICYmIHNbMl0gPT0gc1s2XSkKICAgICk7Cn0KCnZvaWQgYmZzKHN0cmluZyBzID0gIi4uLi4uLi4uLiIpIHsKICAgIHF1ZXVlPHBhaXI8c3RyaW5nLCBib29sPj4gcTsgLy8gZ3JpZCwgcGxheWVyKCBYIC0tPiAxLCBPIC0tPiAwKQogICAgcS5wdXNoKHtzLCAxfSk7CiAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgIHBhaXI8c3RyaW5nLCBib29sPiBwID0gcS5mcm9udCgpOwogICAgICAgIHEucG9wKCk7CiAgICAgICAgc3RyaW5nIGdyaWQgPSBwLmZpcnN0OwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChncmlkW2ldID09ICcuJykgewogICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kKSBncmlkW2ldID0gJ1gnOyBlbHNlIGdyaWRbaV0gPSAnTyc7CiAgICAgICAgICAgICAgICBpZiAoIWlzV2luKGdyaWQpKQogICAgICAgICAgICAgICAgICAgIHEucHVzaCh7Z3JpZCwgcC5zZWNvbmQgXiAxfSk7CiAgICAgICAgICAgICAgICBpZiAoaXNXaW4oZ3JpZCkpCiAgICAgICAgICAgICAgICAgICAgbXBbZ3JpZF0gPSAxOwogICAgICAgICAgICAgICAgZ3JpZFtpXSA9ICcuJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdm9pZCBzb2x2ZSgpIHsKICAgIHN0cmluZyBzOwogICAgYmZzKCk7CiAgICB3aGlsZSAoY2luID4+IHMpIHsKICAgICAgICBpZiAocyA9PSAiZW5kIikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY291dCA8PCAobXBbc10gPyAidmFsaWRcbiIgOiAiaW52YWxpZFxuIik7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgZmFzdCgpOwogICAgLy9mcmVvcGVuKCJhYmMuaW4iLCAiciIsIHN0ZGluKTsKICAgIC8vZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIGludCBUID0gMTsKICAgIC8vY2luID4+IFQ7CiAgICB3aGlsZSAoVC0tKSB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9