Problem: A professor of anthropology was interested in people living in isolated islands and their history. He collected their family trees to conduct some anthropological experiment. For the experiment, he needed to process the family trees with a computer. For that purpose he translated them into text files. The following is an example of a text file representing a family tree.


John
Robert
Frank
Andrew
Nancy
David


Each line contains the given name of a person. The name in the first line is the oldest ancestor in this family tree. The family tree contains only the descendants of the oldest ancestor. Their husbands and wives are not shown in the family tree. The children of a person are indented with one more space than the parent. For example, Robert and Nancy are the children of John, and Frank and Andrew are the children of Robert. David is indented with one more space than Robert, but he is not a child of Robert, but of Nancy. To represent a family tree in this way, the professor excluded some people from the family trees so that no one had both parents in a family tree.

For the experiment, the professor also collected documents of the families and extracted the set of statements about relations of two persons in each family tree. The following are some examples of statements about the family above.


John is the parent of Robert.
Robert is a sibling of Nancy.
David is a descendant of Robert.


For the experiment, he needs to check whether each statement is true or not. For example, the first two statements above are true and the last statement is false. Since this task is tedious, he would like to check it by a computer program.



Input

The input contains several data sets. Each data set consists of a family tree and a set of statements. The first line of each data set contains two integers n (0 < n < 1000) and m (0 < m < 1000) which represent the number of names in the family tree and the number of statements, respectively. Each line of the input has less than 70 characters.

As a name, we consider any character string consisting of only alphabetic characters. The names in a family tree have less than 20 characters. The name in the first line of the family tree has no leading spaces. The other names in the family tree are indented with at least one space, i.e., they are descendants of the person in the first line. You can assume that if a name in the family tree is indented with k spaces, the name in the next line is indented with at most k + 1 spaces. This guarantees that each person except the oldest ancestor has his or her parent in the family tree. No name appears twice in the same family tree. Each line of the family tree contains no redundant spaces at the end.

Each statement occupies one line and is written in one of the following formats, where X and Y are different names in the family tree.


X is a child of Y.
X is the parent of Y.
X is a sibling of Y.
X is a descendant of Y.
X is an ancestor of Y.


Names not appearing in the family tree are never used in the statements. Consecutive words in a statement are separated by a single space. Each statement contains no redundant spaces at the beginning and at the end of the line.

The end of the input is indicated by two zeros.

Output

For each statement in a data set, your program should output one line containing True or False. The first letter of True or False in the output must be a capital. The output for each data set should be followed by an empty line.

Examples

Input

6 5
John
 Robert
  Frank
  Andrew
 Nancy
  David
Robert is a child of John.
Robert is an ancestor of Andrew.
Robert is a sibling of Nancy.
Nancy is the parent of Frank.
John is a descendant of Andrew.
2 1
abc
 xyz
xyz is a child of abc.
0 0


Output

True
True
True
False
False

True


Input

6 5
John
Robert
Frank
Andrew
Nancy
David
Robert is a child of John.
Robert is an ancestor of Andrew.
Robert is a sibling of Nancy.
Nancy is the parent of Frank.
John is a descendant of Andrew.
2 1
abc
xyz
xyz is a child of abc.
0 0


Output

True
True
True
False
False

True

Solution (in CPP):

Solution:
#include<map>
#include<sstream>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<iostream>
#include<cassert>
#define F first
#define S second
#define pb push_back
#define all(n) n.begin(),n.end()
using namespace std;
typedef pair<string,int> SI;

int oldest,youngest;

void split(vector<SI>& vec,string line)
{
  int space_cnt = 0;
  for(int i=0;line[i] == ' ';i++,space_cnt++){}

  vec.push_back(SI(line.substr(space_cnt,line.size()-space_cnt),space_cnt));
  oldest = min(oldest,space_cnt);
  youngest = max(youngest,space_cnt);
}

void ParseAndSolve(vector<SI>& vec,map<string,int>& index_tree,map<int,vector<string> >& space_tree,map<string,int>& level_tree,string line)
{
  vector<string> info;
  stringstream ss(line);
  string mid;
  vector<string> ope; 
 

  for(int i=0;i<ss.str().size();i++)
    {
      if((ss >> mid).fail())
	goto skip;
      
      ope.push_back(mid);
      
    }

 skip:

  info.push_back(ope[0]);
  for(int i=1;i<ope.size()-1;i++)
    {
      if(ope[i] == "child" || ope[i] == "parent" || ope[i] == "sibling" || ope[i] == "descendant" || ope[i] == "ancestor")
	{
	  info.push_back(ope[i]);
	  break;
	}
    }
  info.push_back(ope[ope.size()-1].substr(0,ope[ope.size()-1].size()));


  assert(info.size() == 3);

  string X,Y;
  X = info[0],Y = info[2];

  if(info[1][0] == 'c')
    {
      int Yindex = index_tree[Y];     
      int Xindex = index_tree[X];

      if(level_tree[X] <= level_tree[Y] || Yindex+1 >= vec.size() || vec[Yindex+1].S != vec[Xindex].S)
	{
	  cout << "False" << endl;
	  return;
	}

   
      int parent_level = vec[Yindex].S;

      for(int i=Yindex+1;parent_level < vec[i].S && i < vec.size();i++)
	{

	  if(vec[i].F == X)
	    {
	      cout << "True" << endl;
	      return;
	    }
	}

      cout << "False" << endl;
      return;
    }
  else if(info[1][0] == 'p')
    {

      int Xindex = index_tree[X];
      int Yindex = index_tree[Y];

      if(level_tree[X] >= level_tree[Y] || Xindex+1 >= vec.size() || vec[Xindex+1].S != vec[Yindex].S )
	{
	  cout << "False" << endl;
	  return;
	}


      int parent_level = vec[Xindex].S;

      for(int i=Xindex+1;parent_level < vec[i].S && i < vec.size();i++ )
	{
	  if(vec[i].F == Y)
	    {
	      cout << "True" << endl;
	      return;
	    }
	}

      cout << "False" << endl;
      return;


    }
  else if(info[1][0] == 's')
    {
      int Xindex = index_tree[X];
      int Yindex = index_tree[Y];

      if(vec[Xindex].S != vec[Yindex].S || min(Xindex,Yindex)+1 >= vec.size())
	{
	  cout << "False" << endl;
	  return;
	}

      int sibling_level = vec[Xindex].S;

      int Maxindex,Minindex;
      string Maxname,Minname;

      if(Xindex > Yindex)
	{
	  Maxindex = Xindex,Minindex = Yindex;
	  Maxname = X,Minname = Y;
	}
      else 
	{
	  Maxindex = Yindex,Minindex = Xindex;
	  Maxname = Y,Minname = X;
	}

      for(int i=Minindex+1;i<vec.size() && sibling_level <= vec[i].S;i++)
	{
	  if(Maxname == vec[i].F)
	    {
	      cout << "True" << endl;
	      return;
	    }
	}
      cout << "False" << endl;
      return;

    }
  else if(info[1][0] == 'd')
    {
      int Xindex = index_tree[X];
      int Yindex = index_tree[Y];

      if(Yindex+1 >= vec.size() || vec[Xindex].S <= vec[Yindex].S)
	{
	  cout << "False" << endl;
	  return;
	}

      for(int i=Yindex+1;i<vec.size() && vec[i].S > vec[Yindex].S;i++)
	{
	  if(vec[i].F == vec[Xindex].F)
	    {
	      cout << "True" << endl;
	      return;
	    }
	}

      cout << "False" << endl;
      return;
    }
  else if(info[1][0] == 'a')
    {
      int Xindex = index_tree[X];
      int Yindex = index_tree[Y];
      if(Xindex+1 >= vec.size()  || vec[Xindex].S >= vec[Yindex].S)
	{
	  cout << "False" << endl;
	  return;
	}

      for(int i=Xindex+1;i < vec.size() && vec[i].S > vec[Xindex].S;i++)
	{
	  if(vec[i].F == vec[Yindex].F)
	    {
	      cout << "True" << endl;
	      return;
	    }
	}

      cout << "False" << endl;
      return;
    }
  else 
    assert(false);
  

}

int main()
{
  int n,m;
  while(true)
    {
      cin >> n >> m;
      //cerr << n << " " << m << endl;
      if(!(n+m))
	break;
      oldest = (1<<28);
      youngest = -1;
      cin.ignore();
      string line;
      vector<SI> vec;
      for(int i=0;i<n;i++)
	{
	  getline(cin,line);
	  //cerr << line << endl;
	  split(vec,line);
	}

      map<int,vector<string> > space_tree;
      map<string,int> level_tree;
      map<string,int> index_tree;
      for(int i=0;i<n;i++)
	{
	  index_tree[vec[i].F] = i;
	  level_tree[vec[i].F] = vec[i].S;
	  space_tree[vec[i].S].pb(vec[i].F);
	}

      for(int i=0;i<m;i++)
	{
	  getline(cin,line);
	  //cerr << line << endl;
	  ParseAndSolve(vec,index_tree,space_tree,level_tree,line.substr(0,line.size()-1));
	 
	}

      cout << endl;
    }
  return 0;
}