#include <iostream>
#include <vector>
using namespace std;
vector<string> ipToVector(string ip){
vector<string> v;
int pos = ip.find_first_of('.');
v.push_back(ip.substr(0,pos));
ip = ip.substr(pos+1);
pos = ip.find_first_of('.');
v.push_back(ip.substr(0,pos));
ip = ip.substr(pos+1);
pos = ip.find_first_of('.');
v.push_back(ip.substr(0,pos));
ip = ip.substr(pos+1);
pos = ip.find_first_of('.');
v.push_back(ip.substr(0,pos));
ip = ip.substr(pos+1);
return v;
}
bool isValidIp(string ip){
bool bisValid = true;
// 解析出每一段数字,判断是否在 0 到 255之间
vector<string> v = ipToVector(ip);
for(auto s : v){
int t = stoi(s);
if(t < 0 || t > 255){
bisValid = false;
}
}
return bisValid;
}
bool isValidMask(string ip){
bool bisValid = true;
// 先判断是否是合格IP
if(!isValidIp(ip)){
bisValid = false;
}else{
vector<string> v = ipToVector(ip);;
size_t ans = 0;
int len = v.size();
for(int i = 0; i < len -1; ++i){
int vi = stoi(v[i]);
int vii = stoi(v[i+1]);
if(vi < 255 && vii > 0){
bisValid = false;
}
}
}
return bisValid;
}
size_t ipToInt(string ip){
vector<string> v = ipToVector(ip);
size_t ans = 0;
for(auto s : v){
size_t t = stoi(s);
ans |= t;
ans = ans << 8;
}
return ans;
}
bool isSameNetWork(string ip1, string ip2, string mask){
size_t ip11 = ipToInt(ip1);
size_t ip22 = ipToInt(ip2);
size_t mask1 = ipToInt(mask);
size_t and1 = (ip11 & mask1);
size_t and2 = (ip22 & mask1);
return and1 == and2;
}
int main() {
string mask, ip1, ip2;
while(cin >> mask >> ip1 >> ip2){
if(!isValidMask(mask) || !isValidIp(ip1) || !isValidIp(ip2)){
cout << 1 << endl;
continue;
}
if(isSameNetWork(ip1,ip2,mask)){
cout << 0 << endl; // 属于同一网络打印 0
}else{
cout << 2 << endl; // 不属于同一网络打印 2
}
}
}
// 64 位输出请用 printf("%lld")