#include <iostream>
using namespace std;
int countAt(string &s)
{
int amount = 0;
for (char si : s)
{
if (si == '@')
amount++;
if (amount > 1)
return false;
}
return amount == 1;
}
bool checkLocal(string &local)
{
for (char si : local)
{
if ('A' <= si && si <= 'Z')
continue;
if ('a' <= si && si <= 'z')
continue;
if ('0' <= si && si <= '9')
continue;
if (si == '.' || si == '_')
continue;
return false;
}
return true;
}
bool checkDomain(string &domain)
{
for (char si : domain)
{
if ('A' <= si && si <= 'Z')
continue;
if ('a' <= si && si <= 'z')
continue;
if (si == '.')
continue;
return false;
}
int amount = 0;
for (char si : domain)
{
if (si == '.')
amount++;
}
if (amount == 0)
return false;
for (int i = 0; i < domain.length() - 1; i++)
{
if (domain[i] == '.' && domain[i + 1] == '.')
return false;
}
return true;
}
bool check(string &s)
{
if (countAt(s) == false)
return false;
string local = "";
string domain = "";
int i = 0;
while (s[i] != '@')
{
local += s[i];
i++;
}
i++;
while (i < s.length())
{
domain += s[i];
i++;
}
if (local.length() == 0 || domain.length() == 0)
return false;
if (checkLocal(local) == false)
return false;
if (checkDomain(domain) == false)
return false;
return true;
}
int main()
{
string s;
getline(cin, s);
cout << (check(s) ? "VALID\n" : "INVALID\n");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGNvdW50QXQoc3RyaW5nICZzKQp7CiAgICBpbnQgYW1vdW50ID0gMDsKCiAgICBmb3IgKGNoYXIgc2kgOiBzKQogICAgewogICAgICAgIGlmIChzaSA9PSAnQCcpCiAgICAgICAgICAgIGFtb3VudCsrOwogICAgICAgIGlmIChhbW91bnQgPiAxKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIGFtb3VudCA9PSAxOwp9Cgpib29sIGNoZWNrTG9jYWwoc3RyaW5nICZsb2NhbCkKewogICAgZm9yIChjaGFyIHNpIDogbG9jYWwpCiAgICB7CiAgICAgICAgaWYgKCdBJyA8PSBzaSAmJiBzaSA8PSAnWicpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmICgnYScgPD0gc2kgJiYgc2kgPD0gJ3onKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoJzAnIDw9IHNpICYmIHNpIDw9ICc5JykKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKHNpID09ICcuJyB8fCBzaSA9PSAnXycpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9Cgpib29sIGNoZWNrRG9tYWluKHN0cmluZyAmZG9tYWluKQp7CiAgICBmb3IgKGNoYXIgc2kgOiBkb21haW4pCiAgICB7CiAgICAgICAgaWYgKCdBJyA8PSBzaSAmJiBzaSA8PSAnWicpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmICgnYScgPD0gc2kgJiYgc2kgPD0gJ3onKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoc2kgPT0gJy4nKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaW50IGFtb3VudCA9IDA7CgogICAgZm9yIChjaGFyIHNpIDogZG9tYWluKQogICAgewogICAgICAgIGlmIChzaSA9PSAnLicpCiAgICAgICAgICAgIGFtb3VudCsrOwogICAgfQoKICAgIGlmIChhbW91bnQgPT0gMCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb21haW4ubGVuZ3RoKCkgLSAxOyBpKyspCiAgICB7CiAgICAgICAgaWYgKGRvbWFpbltpXSA9PSAnLicgJiYgZG9tYWluW2kgKyAxXSA9PSAnLicpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9Cgpib29sIGNoZWNrKHN0cmluZyAmcykKewogICAgaWYgKGNvdW50QXQocykgPT0gZmFsc2UpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIHN0cmluZyBsb2NhbCA9ICIiOwogICAgc3RyaW5nIGRvbWFpbiA9ICIiOwoKICAgIGludCBpID0gMDsKICAgIHdoaWxlIChzW2ldICE9ICdAJykKICAgIHsKICAgICAgICBsb2NhbCArPSBzW2ldOwogICAgICAgIGkrKzsKICAgIH0KCiAgICBpKys7CgogICAgd2hpbGUgKGkgPCBzLmxlbmd0aCgpKQogICAgewogICAgICAgIGRvbWFpbiArPSBzW2ldOwogICAgICAgIGkrKzsKICAgIH0KCiAgICBpZiAobG9jYWwubGVuZ3RoKCkgPT0gMCB8fCBkb21haW4ubGVuZ3RoKCkgPT0gMCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgaWYgKGNoZWNrTG9jYWwobG9jYWwpID09IGZhbHNlKQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICBpZiAoY2hlY2tEb21haW4oZG9tYWluKSA9PSBmYWxzZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKQp7CiAgICBzdHJpbmcgczsKICAgIGdldGxpbmUoY2luLCBzKTsKCiAgICBjb3V0IDw8IChjaGVjayhzKSA/ICJWQUxJRFxuIiA6ICJJTlZBTElEXG4iKTsKCiAgICByZXR1cm4gMDsKfQ==