#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
#define MAX_N 110
#define INF (1<<30)
int rooter_num;
struct Node
{
  vector<int> edges_to;
  vector<int> edges_cost;
  
  bool done;
  int cost;
};
int dijkstra(int,int);
vector<Node> A;
int main()
{
  int n,startNode,goalNode,TTL;
  int r,k,t;
  int a;
  Node node;
  /*------------input---------------*/
  cin>>rooter_num;
  for(int i=0;i<=rooter_num;i++)
    {
      A.push_back(node);
    }
  for(int i=0;i<rooter_num;i++)
    {
      cin>>r>>k;
      for(int j=0;j<k;j++)
	{
	  cin>>t;
	  A[r].edges_to.push_back(t);
	  A[r].edges_cost.push_back(1);
	}
    }
  cout<<"edges_to="<<A[1].edges_to[0]<<endl;
  /*--------------------------------*/


  /*-------------search-------------*/
  cin>>n;
  for(int i=0;i<n;i++)
    {
      cin>>startNode>>goalNode>>TTL;
      a=dijkstra(startNode,goalNode);
      if(TTL>a)cout<<a+1<<endl;
      else cout<<"NA"<<endl;
    }
  /*--------------------------------*/
  return 0;
}
int dijkstra(int start,int goal)
{
  int min;

  /*-----init----*/
  for(int i=0;i<=rooter_num;i++)
    {
      A[i].done=false;
      A[i].cost=INF;
    }
  A[start].cost=0;
  /*-------------*/
  
  
  while(true)
    {
      min=INF;
      for(int i=1;i<rooter_num;i++)
	{
	  if(A[i].done==false&&min>A[i].cost)
	    {
	      min=A[i].cost;
	    }
	}
      if(min==INF)break;
      /*
	確定ノードでなく,かつ現在一番累計コストの低いノードを探した
      */


      for(int currentNode=1;currentNode<rooter_num;currentNode++)
	{
	  if(A[currentNode].cost==min)
	    {
	      A[currentNode].done=true;
	      /*
		上で確定したノードを見つけ出し,マークした。
	      */

	      for(int i=0;i<A[currentNode].edges_to.size();i++)
		{
		  int nextNode=A[currentNode].edges_to[i];
		  
		  if(A[nextNode].cost>A[currentNode].edges_cost[i]+A[currentNode].cost)
		    {
		      A[nextNode].cost=A[currentNode].edges_cost[i]+A[currentNode].cost;
		    }  
		}
	      /*
		確定したノードから飛び,現在までの最小累計コストより
		低くなる場合は最小累計コストを更新する
	      */
	    }
	  
	}
      
    }
  
  return A[goal].cost;
}