Problem:
パケット転送

インターネットでは、データはパケットに分割され、パケットごとにルータと呼ばれる中継機器を介して宛先に転送されます。各ルータはパケットに記載された宛先から次に転送すべきルータを判断します。さらに、無限にルータ間を転送され続けることを防ぐため、パケットには TTL（Time To Live） という値が付加されています。ルータは受け取ったパケットの TTL を 1 減算し、その結果が 0 ならそのパケットを破棄し、それ以外なら次のルータに転送します。

そこで、ネットワークの設計を手助けするプログラムを作ることになりました。ネットワークの接続情報と送信パケットの情報を入力として、各パケットが宛先ルータに到着するまでに経由するルータの数のうち最小の値を表示するプログラムを作成してください。

ネットワークは図のように複数のルータとそれらを結ぶケーブルで構成されています。ただし、各接続（ケーブル）は単方向であることに注意してください。各ルータが直接つながっているルータの番号の配列がネットワークの接続の情報として与えられます。ルータの数を n とすれば、各ルータは 1 から n までの整数で識別されます。送信元から宛先ルータまでの経路が複数ある場合は、経由するルータの数が少ない方の値を出力してください。また、パケットが宛先に到達しない場合は NA と出力してください。

例えば、以下の図のようなネットワークで、送信元ルータが 6、宛先ルータが 5 の場合を考えます。最短経路は 6→1→5 であり経由するルータは 3 個です。この場合、TTL はルータ 6、1 でそれぞれ減算されるので、送信時の TTL が 3 以上であればパケットは到達できます。宛先ルータでは TTL を減算する必要はありません。また、送信元と宛先が同じルータになるようなパケットは無いものとします。

Input

入力は以下の形式で与えられます。

n
r1 k1 t11 t12 ... t1k1
r2 k2 t21 t22 ... t2k2
:
rn kn tn1 tn2 ... tnkn
p
s1 d1 v1
s2 d2 v2
:
sp dp vp

1 行目にルータの総数 n（n ≤ 100）、続く n 行に i 番目のルータの接続情報が与えられます。接続情報として、i 番目のルータの番号 ri、i 番目のルータと直接接続しているルータの個数 ki、i 番目のルータから送信できるルータの番号 ti1, ti2, ... tikiが与えられます。

続く行にパケットの個数 p（p ≤ 1000）、続く p 行に i 番目のパケットの情報が与えられます。パケットの情報として、 送信元ルータの番号 si, 宛先ルータの番号 di, TTL の値 vi (0 ≤ vi ≤ 10000) が与えられます。

Output

各パケットごとに、経由するルータの個数または NA を１行に出力してください。

Sample Input

7
1 4 2 5 4 3
2 1 5
3 1 6
4 1 7
5 2 7 6
6 1 1
7 0
6
1 2 2
1 5 3
1 2 1
5 1 3
6 3 3
1 7 4

Output for the Sample Input

2
2
NA
3
3
3

Solution in JAVA (judge verdict: Accepted)

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
 
public class Main {
	/**
	* @param args
	*/
	static class RT extends HashMap<Integer, int[]>{}
	static class DS extends HashMap<Integer, Integer>{}
	static class LS extends ArrayList<Integer>{}
	static class AS extends HashMap<Integer, DS>{}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RT		m = new RT();
		AS		o = new AS();
		int		n = parseNum();
		int		p = 0;
		int		s = 0;
		int		d = 0;
		int		v = 0;
		int[]	T = new int[n];

		// ルータの経路を取得
		for (int i = 0; i < T.length; i++) {
			int		cr = parseNum();
			int[]	nr = new int[parseNum()];

			for (int j = 0; j < nr.length; j++) {
				nr[j] = parseNum();
			}
			m.put(cr, nr);
			T[i] = cr;
		}

		// 他のルータまでの距離を取得
		for (int i = 0; i < T.length; i++) {
			int		len = 0;
			int		cnt = 2;
			DS		ttl = new DS();
			LS		lst = new LS();

			lst.add(T[i]);
			ttl.put(T[i], 1);
			while ((len = lst.size()) > 0) {
				for (int j = 0; j < len; j++) {
					int[]	np = m.get(lst.remove(0));
					for (int k = 0; k < np.length; k++) {
						if (!ttl.containsKey(np[k])) {
							ttl.put(np[k], cnt);
							lst.add(np[k]);
						}
					}
				}
				cnt++;
			}

			o.put(T[i], ttl);
		}

		p = parseNum();
		for (int i = 0; i < p; i++) {
			s = parseNum();
			d = parseNum();
			v = parseNum();
			if (!o.containsKey(s)) {
				System.out.println("NA");
			} else {
				DS	tmp = o.get(s);
				if (!tmp.containsKey(d)) {
					System.out.println("NA");
				} else {
					int	max = tmp.get(d);
					if (v < max) {
						System.out.println("NA");
					} else {
						System.out.println(Math.min(v, max));
					}
				}
			}
		}
	}
 
	private static int parseNum() {
		try {
			int	buf = 0;
			int	num = 0;
			int	mns = 0;
			int	skp = 1;
 
			// -,0〜9以外は読み飛ばす
			while (true) {
				buf = System.in.read();
				if (buf == '-') {
					mns = 1;
					skp = 0;
				} else if (buf >= '0' && buf <= '9') {
					num = num * 10 + (buf - '0');
					skp = 0;
				} else if (skp == 0) {
					return (mns == 0)?num:num*(-1);
				}
			}
		} catch (IOException e) {}
		return -1;
	}
}