from collections import deque
from string import ascii_lowercase

def word_ladder(begin, end, words):
    if begin == end:
        return 1
    remaining = set(words)
    if end not in remaining:
        return 0
    remaining.discard(begin)
    queue = deque([(begin, 1)])
    while queue:
        word, length = queue.popleft()
        for i in range(len(word)):
            for char in ascii_lowercase:
                if char == word[i]:
                    continue
                candidate = word[:i] + char + word[i + 1:]
                if candidate not in remaining:
                    continue
                if candidate == end:
                    return length + 1
                remaining.remove(candidate)
                queue.append((candidate, length + 1))
    return 0
