#!/usr/bin/env python3

from common import parse_file, cave_is_small


def search_paths(cave_system, cave="start", marked = set(), paths = [], path = []):
    path = [*path, cave]

    if cave == "end":
        return [*paths, path]

    if cave_is_small(cave):
        marked.add(cave)

    for connected_cave in cave_system[cave]:
        if connected_cave in marked:
            continue

        paths = search_paths(cave_system, connected_cave, set(marked), paths, path)

    return paths


def short_path_filter(path):
    small_caves = []

    for cave in path[1:-1]:
        if not cave_is_small(cave):
            if cave in small_caves:
                return False
            small_caves.append(cave)

    return True


def only_short_paths(paths):
    return list(filter(short_path_filter, paths))


if __name__ == "__main__":
    import sys

    cave_system = parse_file(sys.argv[1])

    paths = search_paths(cave_system)

    print(len(only_short_paths(paths)))