#include <iostream>
#include <string>
using namespace std;
// test data:
// 0.0.0.0
// 127.0.0.1
// 666.666.666.666
// 256.0.0.1
// 1.256.0.1
// -1.888.666.233
// 123456.666666.11.11
// 000.000.000.000
// abc.12.55.66
// 123.11.1
int stringToInt(string in){
int res=0,power=1;
for(long long unsigned int i=0;i<in.size();i++){
res+=(in[in.size()-1-i]-'0')*power;
power*=10;
}
return res;
}
bool judge(string input){
string part[4];
for(int i=0;i<3;i++){ // 按 . 分割,不足3个和大于3个都false
int pos=input.find('.');
if(pos==string::npos||pos>3) return false; // 每个字段位数>3 超出 或 不足4个字段
part[i]=input.substr(0,pos);
input = input.substr(pos+1);
// cout<<part[i]<<endl;
// cout<<part[i].size()<<endl;
}
part[3]=input;
// cout<<part[3]<<endl;
if(input.find('.')!=string::npos) return false; // 字段数目超出
for(int i=0;i<4;i++){ // 校验值0~255
for(long long unsigned int k=0;k<part[i].size();k++){ // 检验是否是数字构成
if(part[i][k]>='0'&&part[i][k]<='9')
continue;
else return false;
}
int partNum=stringToInt(part[i]);
if(partNum>=0&&partNum<=255) continue;
else return false;
}
return true;
}
int main(){
string input;
while(cin>>input){
if(judge(input)) cout<<"Yes!"<<endl;
else cout<<"No!"<<endl;
}
return 0;
}