#!/usr/bin/python3 import functools from collections import defaultdict # funkce map aplikuje svůj první argument na každý prvek druhého argumentu # nejprve tedy přečteme řádek a uděláme z něj seznam slov # každé slovo samostatně převedeme na int a nakonec posbíráme do jednoho seznamu params = list(map(int, input().split())) # params je dvouprvkový seznam, tímto způsobem si jednoduše prvky přiřadíme # do mnohem přehledněji pojmenovaných proměnných item_count, recipe_count = params costs = list(map(int, input().split())) # defaultdic se chová jako slovník, ale pokud tázaný prvek neexistuje, # potají napřed do slovníku vloží výsledek volání funkce podané konstruktoru # (v našem případě funkce list). Nemusíme tedy později v kódu rozlišovat # případ, kdy tázaný předmět nejde vyrobit, neboť automaticky dostaneme # prázdný seznam receptů. recipes = defaultdict(list) for _ in range(recipe_count): params = list(map(int, input().split())) output, input_count = params inputs = list(map(int, input().split())) recipes[output].append(inputs) # dekorátor functools.cache sám zařídí, že jednou spočítané výsledky pro dané # argumenty se zapamatují a později vytáhnou bez nutnosti opakování výpočtu @functools.cache def get_cost(item_id: int) -> int: possible_costs = [costs[item_id]] for recipe in recipes[item_id]: possible_costs.append(sum(map(get_cost, recipe))) return min(possible_costs) print(get_cost(0))