#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;
}