#include <iostream>
#include <string>
#include <vector>

using namespace std;


void stringToVector(string strIn, vector<int> &vecOut)
{
    string temp;
    for(int i = 0; i < strIn.size(); i++) {
        if(strIn[i] != '.') {
            temp += strIn[i];
        } else if (strIn[i] == '.'){
            vecOut.push_back(stoi(temp));
            temp.clear();
            
        }
        if(i == strIn.length() - 1) {
            vecOut.push_back(stoi(temp));
        }
    }
}

/*
思路:输入字符串的’.‘为分隔符,分别获取数据段且转化为整型;掩码与ip地址进行逻辑与运算;
如果IP地址或子掩码小于0或大于255,则非法输出1;如果掩码小于255,下一个为0,否则非法格式输出1;
如果IP1与IP2属于同一子网络,则输出0;
如果ip1与ip2不属于同一子网络,则输出2.
*/
int SubNetwork(string mask, string ip1, string ip2)
{
    vector<int> maskVec;
    vector<int> ipVec1;
    vector<int> ipVec2;
    stringToVector(mask, maskVec);
    stringToVector(ip1, ipVec1);
    stringToVector(ip2, ipVec2);
    for(int i = 0; i < 4; i++) {
         if((maskVec[i] < 0  || maskVec[i] > 255) || (ipVec1[i]  < 0) || (ipVec1[i] > 255)
               || (ipVec2[i]  < 0) || (ipVec2[i] > 255)) {
                return 1;
         }
         if (i < 3) {
            if ((maskVec[i] < 255) && (maskVec[i+1] > 0)) {
                return 1;
            }
        }
    }
     for(int i = 0; i < 3; i++) {
         int f1 = maskVec[i] & ipVec1[i];
         int f2 =  maskVec[i] & ipVec2[i];
         if(f1 != f2) {
             return 2;
         }
    }
    return 0;
}



int main()
{
    string mask, ip1, ip2;
    while(cin>>mask>>ip1>>ip2) {
        cout<<SubNetwork(mask, ip1, ip2)<<endl;
    }
    return 0;
}