#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int dy[32][16];
int dyn[32];
int r[32][32][2];
#define INF 10000000
class History{
public:
string verifyClaims(vector <string> dynasties, vector <string> battles, vector <string> queries){
int N = dynasties.size();
// parse
for( int i=0; i<N; i++ ){
int idx=0;
string& s = dynasties[i];
for( int j=0; j<s.size(); j++ ){
if( s[j] == ' ' ) idx++;
else dy[i][idx] = dy[i][idx]*10 + s[j] - '0';
}
dyn[i] = idx + 1;
}
// analyse
string bs;
for( int i=0; i<N; i++ ) for( int j=0; j<N; j++ ){
if( i==j ){ r[i][j][0] = 0; r[i][j][1] = 0; }
else { r[i][j][0] = -INF; r[i][j][1] = INF; }
}
for( int i=0; i<battles.size(); i++ ) bs += battles[i];
for( int i=0; i<bs.size(); i += 6 ){
int c0 = bs[i ] - 'A'; int y0 = bs[i+1] - '0';
int c1 = bs[i+3] - 'A'; int y1 = bs[i+4] - '0';
r[c0][c1][0] = max( r[c0][c1][0], dy[c1][y1] - (dy[c0][y0+1]-1) );
r[c0][c1][1] = min( r[c0][c1][1], (dy[c1][y1+1]-1) - dy[c0][y0] );
r[c1][c0][0] = max( r[c1][c0][0], -r[c0][c1][1] );
r[c1][c0][1] = min( r[c1][c0][1], -r[c0][c1][0] );
}
for( int i=0; i<N; i++ ){
for( int j=0; j<N; j++ ){
if( j==i ) continue;
for( int k=0; k<N; k++ ){
if( k==i || j==k ) continue;
r[j][k][0] = max( r[j][k][0], r[j][i][0] + r[i][k][0] );
r[j][k][1] = min( r[j][k][1], r[j][i][1] + r[i][k][1] );
}
}
}
// query
string ret;
for( int i=0; i<queries.size(); i++ ){
string& s = queries[i];
int c0 = s[0] - 'A'; int y0 = s[1] - '0';
int c1 = s[3] - 'A'; int y1 = s[4] - '0';
int r0 = dy[c1][y1] - (dy[c0][y0+1]-1);
int r1 = (dy[c1][y1+1]-1) - dy[c0][y0];
if( r1 < r[c0][c1][0] || r0 > r[c0][c1][1] ) ret += "N";
else ret+= "Y";
}
return ret;
}
};