Multithreaded Program
Maurice is debugging a multithreaded program on his old machine. The program has several threads operating on a set of shared variables. Each thread executes its own sequence of assignments in a predefined program order. Each assignment sets one of the variables to an integer value.
When the program is run, assignments from different threads can be executed in any order. The only guarantee is that each thread executes all of its assignments in the program order.
For example, let's say the program has three threads that have , , and assignments in their sequences, respectively. Then one valid program execution looks as follows:
thread executes the first assignment in its sequence;
thread executes the first assignment in its sequence;
thread executes the second assignment in its sequence;
thread executes the second assignment in its sequence;
thread executes the only assignment in its sequence.
This execution can be described as , where numbers specify the threads performing each assignment, in order. Note that many other valid executions are possible.
Maurice suspects that his machine is broken and can work incorrectly. He has run his program and recorded the values of all variables at the end.
Find an execution of the program that performs all assignments and leads to the recorded values of all variables, or report that the machine is indeed broken and such an execution does not exist.
Input
The first line contains a single integer — the number of threads (). The threads are numbered from to . The following lines describe sequences of assignments, one per thread.
The first line of the -th description contains an integer — the length of the sequence of assignments of the -th thread (). Each of the following lines contains an assignment in the form "<variable>=<value>
". The assignments are listed in the program order. Variable names consist of up to lowercase English letters, and values are positive integers not exceeding .
The first of the remaining lines contains an integer — the number of variables (). Each of the following lines contains a variable name and its recorded value, which is a positive integer not exceeding . Each variable used in the program is listed exactly once, and each listed variable is used in at least one assignment.
Output
Print "Yes"
if an execution producing the recorded values exists, and "No"
otherwise.
If an execution exists, print a line containing integers , describing such an execution (). This specifies that the first assignment is performed by thread , the second one is performed by thread , and so on. Each thread performs its assignments in the program order. After the -th assignment, each variable must have the recorded value. The -th thread must appear in the description exactly times.