package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
    var mask, ip1, ip2 string 
    fmt.Scanf("%s\n%s\n%s", &mask, &ip1, &ip2)
    masks := strings.SplitN(mask, ".", -1)
    ip1s := strings.SplitN(ip1, ".", -1)
    ip2s := strings.SplitN(ip2, ".", -1)
    if len(ip1s) != 4 || len(ip2s) != 4 || len(masks) != 4 {
        fmt.Println(1)
        return
    }
    var mask0 = false
    var flag = 0
    for i := 0; i < 4; i++ {
        m, err := strconv.ParseUint(masks[i], 10, 32)
        if err != nil {
            fmt.Println(1)
            return
        }
first, err := strconv.ParseUint(ip1s[i], 10, 32)
        if err != nil {
            fmt.Println(1)
            return
        }
        second, err := strconv.ParseUint(ip2s[i], 10, 32)
        if err != nil {
            fmt.Println(1)
            return
        }
        if first > 255 || second > 255 || m > 255 {
            fmt.Println(1)
            return
        }
        if (first&m) != (second&m) {
            flag = 2
        }
		
	  	// 判断掩码中1是否连续
        for j := 7; j >= 0; j-- {
            if (1<<j)& m == 0 {
                mask0 = true
            } else if mask0 {
                fmt.Println(1)
                return
            }
        }
    }
    fmt.Println(flag)
}