5 2 3 1 0 0
1 20 2 3
2 30 3 4 5
3 50 4
4 60
5 80
class Node{
int val;
Node[] next;
public Node( int n){
next = new Node[n];//数组直接大小为n
}
}
public class Main {
static int ans;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");
int n = Integer.parseInt(s[0]);
Node[] node = new Node[n];
for(int i = 0; i < n; i++){
int size = Integer.parseInt(s[i + 1]);
node[i] = new Node(size);
}
/*for(Node no :node){
System.out.println(no.next.length);
}*/
boolean flag = false;
for(int i = 0; i < n; i++){
s = sc.nextLine().split(" ");
if(s.length < node[i].next.length + 2){
flag = true;
System.out.println("NA");
break;
}else{
node[i].val = Integer.parseInt(s[1]);
int len = node[i].next.length;
for(int j = 0; j < len; j++){
int tmp = Integer.parseInt(s[j + 2]);
node[i].next[j] = node[tmp - 1];
}
}
}
int sum = 0;
ans = 0;
dfs(node[0], sum);
if(flag == false) System.out.println(ans);
}
//归根是一个求根节点到叶子节点的最大权值的,但是我dfs却出了一些问题,与回溯法搞不清楚了
static void dfs(Node node, int sum){
if(node == null) {//如果节点为空,返回
if(ans <sum) ans = sum;
return ;
}
int len = node.next.length;
for(int i = 0; i < len; i++){
sum = sum + node.val;
dfs(node.next[i], sum);
sum = sum - node.val;
}
}
}