M. Многопоточная программа
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Морис отлаживает многопоточную программу на своей старой машине. Программа имеет несколько потоков, работающих с общими переменными. Каждый поток выполняет свою последовательность присваиваний в предопределенном порядке программы. Каждое присваивание устанавливает одну из переменных в целочисленное значение.

При запуске программы присваивания из разных потоков могут выполняться в любом порядке. Единственная гарантия состоит в том, что каждый поток выполняет все свои присваивания в порядке программы.

Например, предположим, что программа имеет три потока, в их последовательностях есть $$$2$$$, $$$2$$$ и $$$1$$$ присваивания соответственно. Тогда одно допустимое выполнение программы выглядит следующим образом:

  • поток $$$1$$$ выполняет первое присваивание в своей последовательности;
  • поток $$$2$$$ выполняет первое присваивание в своей последовательности;
  • поток $$$2$$$ выполняет второе присваивание в своей последовательности;
  • поток $$$1$$$ выполняет второе присваивание в своей последовательности;
  • поток $$$3$$$ выполняет единственное присваивание в своей последовательности.

Это выполнение можно описать как $$$1, 2, 2, 1, 3$$$, где числа указывают потоки, выполняющие каждое присваивание в порядке. Обратите внимание, что возможны и другие допустимые выполнения.

Морис подозревает, что его машина сломана и может работать неправильно. Он запустил свою программу и записал значения всех переменных в конце.

Найдите выполнение программы, которое выполняет все присваивания и приводит к записанным значениям всех переменных, или сообщите, что машина действительно сломана и такое выполнение не существует.

Входные данные

Первая строка содержит одно целое число $$$t$$$ — количество потоков ($$$1 \leq t \leq 100$$$). Потоки нумеруются от $$$1$$$ до $$$t$$$. Следующие строки описывают $$$t$$$ последовательностей присваиваний, по одной на каждый поток.

Первая строка $$$i$$$-го описания содержит целое число $$$l_i$$$ — длину последовательности присваиваний $$$i$$$-го потока ($$$1 \leq l_i \leq 100$$$). Каждая из следующих $$$l_i$$$ строк содержит присваивание в формате "<переменная>=<значение>". Присваивания перечислены в порядке программы. Имена переменных состоят из не более $$$10$$$ строчных английских букв, а значения — положительные целые числа, не превышающие $$$10^9$$$.

Первая из оставшихся строк содержит целое число $$$k$$$ — количество переменных ($$$1 \le k \le 10\,000$$$). Каждая из следующих $$$k$$$ строк содержит имя переменной и ее записанное значение, которое является положительным целым числом, не превышающим $$$10^9$$$. Каждая переменная, используемая в программе, перечислена ровно один раз, и каждая перечисленная переменная используется хотя бы в одном присваивании.

Выходные данные

Выведите "Yes", если существует выполнение, приводящее к записанным значениям, и "No" в противном случае.

Если выполнение существует, выведите строку, содержащую $$$s = l_1 + l_2 + \dotsb + l_t$$$ целых чисел $$$c_1, c_2, \ldots, c_s$$$, описывающих такое выполнение ($$$1 \le c_i \le t$$$). Это указывает, что первое присваивание выполняется потоком $$$c_1$$$, второе — потоком $$$c_2$$$ и так далее. Каждый поток выполняет свои присваивания в порядке программы. После $$$s$$$-го присваивания каждая переменная должна иметь записанное значение. Поток $$$i$$$ должен появляться в описании ровно $$$l_i$$$ раз.

Примеры
Входные данные
2
2
a=1
b=2
2
b=1
a=2
2
a 1
b 1
Выходные данные
No
Входные данные
3
5
start=1
counter=1111
counter=10
counter=3333
finish=1
4
start=2
counter=20
counter=10
finish=2
3
start=3
qwerty=787788
finish=3
4
counter 10
start 1
finish 1
qwerty 787788
Выходные данные
Yes
2 3 3 2 1 1 3 1 1 2 2 1