#include <bits/stdc++.h>
using namespace std;
string str2bin(int num){
if(num == 0) return "00000000";
//cout << "num = " << num << endl;
string binRes = "";
string help = "0123456789ABCDEF";
while(num){
binRes += help[num % 2]; //二进制
num /= 2;
}
reverse(binRes.begin(), binRes.end());
while(binRes.size() < 8){
binRes.insert(binRes.begin(), '0');
}
//cout << "binRes = " << binRes << endl;
return binRes;
}
bool noLegalYanMa(string zwYanMa){
string res = "";
stringstream iss(zwYanMa);
string tmp = "";
bool isNeg = false;
while(getline(iss, tmp, '.')){
if(tmp[0] == '-'){
isNeg = true;
tmp = tmp.substr(1, tmp.size() - 1);
}
//cout << "tmp = " << tmp << endl;
int size = tmp.size();
int num = 0;
for(int i = 0; i < size; i++){
num = num * 10 + (tmp[i] - '0');
}
if(isNeg) num = -num;
//cout << "num==" << num << endl;
if(num < 0 || num > 255) return true;
res += str2bin(num);
}
//cout << "res = " << res << endl;
bool notZero = true;
for(int j = 0; j < res.size(); j++){
if(res[j] == '0') {
notZero = false;
}
else{
if(!notZero){
return true;
}
continue;
}
}
return false;
}
string str2binStr(string s){
string res = "";
stringstream iss(s);
string tmp = "";
while(getline(iss, tmp, '.')){
//cout << "tmp = " << tmp << endl;
int size = tmp.size();
int num = 0;
for(int i = 0; i < size; i++){
num = num * 10 + (tmp[i] - '0');
}
//cout << "num==" << num << endl;
res += str2bin(num);
}
return res;
}
bool noLegalIP(string IP){
string res = "";
stringstream iss(IP);
string tmp = "";
bool isNeg = false;
while(getline(iss, tmp, '.')){
if(tmp[0] == '-'){
isNeg = true;
tmp = tmp.substr(1, tmp.size() - 1);
}
//cout << "tmp = " << tmp << endl;
int size = tmp.size();
int num = 0;
for(int i = 0; i < size; i++){
num = num * 10 + (tmp[i] - '0');
}
if(isNeg) num = -num;
//cout << "num==" << num << endl;
if(num < 0 || num > 255) return true;
}
return false;
}
string anWeiSum(string zwYanMa, string IP){
string s1 = str2binStr(zwYanMa);
string s2 = str2binStr(IP);
cout << s1 << endl;
cout << s2 << endl;
string res = "";
int i = s1.size() - 1;
int j = s2.size() - 1;
int carry = 0; //进位
while(i >= 0 || j >= 0){
int digitA = i >= 0 ? (s1[i--] - '0') : 0; //i--
int digitB = j >= 0 ? (s2[j--] - '0') : 0; //j--
int sum = digitA + digitB + carry;
carry = sum >= 2 ? 1 : 0;
sum = sum >= 2 ? (sum - 2) : sum;
res += to_string(sum);
}
if(carry == 1) res += "1";
reverse(res.begin(), res.end());
cout << res << endl;
return res;
}
string anWeiYu(string zwYanMa, string IP){
string s1 = str2binStr(zwYanMa);
string s2 = str2binStr(IP);
//cout << s1 << endl;
//cout << s2 << endl;
string res;
for(int i = 0; i < 32; i++){
if(s1[i] != s2[i]){
res += "0";
}
else if(s1[i] == '0' && s2[i] == '0'){
res += "0";
}
else{ //s1[i] == '1' && s2[i] == '1'
res += "1";
}
}
//cout << res << endl;
return res;
}
bool isSameZiWang(string zwYanMa, string firstIP, string secondIP){
if(anWeiYu(zwYanMa, firstIP) == anWeiYu(zwYanMa, secondIP)){
return true;
}
return false;
}
void process(string zwYanMa, string firstIP, string secondIP, int& res){
if(noLegalYanMa(zwYanMa) || noLegalIP(firstIP) || noLegalIP(secondIP)){
res = 1;
return;
}
if(isSameZiWang(zwYanMa, firstIP, secondIP)){
res = 0;
}
else{
res = 2;
}
return;
}
int main(){
string zwYanMa = "";
string firstIP = "";
string secondIP = "";
getline(cin, zwYanMa);
getline(cin, firstIP);
getline(cin, secondIP);
int res = 0;
process(zwYanMa, firstIP, secondIP, res);
//anWeiYu(zwYanMa, firstIP);
cout << res << endl;
return 0;
}