#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
using namespace std;
int M, N, X;
#define FOR(i, N) for(int i = 0; i < N; i++)
#define FOR1e(i, N) for(int i = 1; i <= N; i++)
#define REP(i, X, N) for(int i = X; i < N; i++)
#define REP1e(i, X, N) for(int i = X; i <= N; i++)
#define SCAN(N) scanf("%d", &N)
#define SCAN_2(N, X) scanf("%d %d", &N, &X)
#define PAIR pair <string, int>
#define ITR map <PAIR, vector <PAIR > >::iterator
#define MP make_pair
#define PP push_back
bool Vis[ 5010 ] ;
map < PAIR, vector < PAIR > > AdjList;
#define All(it, AdjList) for(ITR it = AdjList.begin(); it != AdjList.end(); it++)
int BFS( PAIR s, string d) {
queue < PAIR> q; q.push ( s) ;
PAIR cur = s; Vis[ 0 ] = 1 ;
int sz = 1 , Cnt = 1 ;
while ( q.size ( ) ) {
while ( sz-- ) {
cur = q.front ( ) ; q.pop ( ) ;
FOR( i, AdjList[ cur] .size ( ) ) {
PAIR child = AdjList[ cur] [ i] ;
if ( child.first == d)
return Cnt;
if ( ! Vis[ child.second ] ) {
Vis[ child.second ] = 1 ;
q.push ( child) ;
}
}
}
sz = q.size ( ) ; Cnt++ ;
}
return 0 ;
}
int main( ) {
// freopen("in.txt", "r", stdin);
int T; SCAN( T) ;
while ( T-- ) {
AdjList.clear ( ) ; AdjList[ MP( "Erdos, P." , 0 ) ] .clear ( ) ;
SCAN_2( M, N) ; cin .ignore ( ) ;
int index = 1 ;
while ( M-- ) {
string Line; getline( cin , Line) ;
stringstream SS( Line) ;
vector < string> Words, Nodes;
int i = 0 ;
bool End = 0 ;
for ( string x; SS >> x; i++ ) {
Words.push_back ( x) ;
if ( i% 2 ) {
if ( Words[ i] [ Words[ i] .size ( ) - 1 ] == ':' ) End = 1 ;
Words[ i] .erase ( Words[ i] .size ( ) - 1 , 1 ) ;
Words[ i- 1 ] + = ' ' + Words[ i] ;
Nodes.push_back ( Words[ i- 1 ] ) ;
if ( End) break ;
}
}
FOR( i, Nodes.size ( ) - 1 )
REP( j, i+ 1 , Nodes.size ( ) ) {
bool F = 0 ;
PAIR x( MP( Nodes[ i] , i) ) , y( MP( Nodes[ j] , j) ) ;
All( it, AdjList) {
if ( it- > first.first == x.first )
{ x.second = it- > first.second ; F = 1 ; break ; }
}
// (F) ? F = 0 : x.second == index++;
if ( F) F = 0 ; else x.second = index, index++ ;
All( it, AdjList) {
if ( it- > first.first == y.first )
{ y.second = it- > first.second ; F = 1 ; break ; }
}
if ( F) F = 0 ; else y.second = index, index++ ;
AdjList[ x] .push_back ( y) ; AdjList[ y] .push_back ( x) ;
}
}
while ( N-- ) {
memset ( Vis, 0 , AdjList.size ( ) + 5 ) ;
string Name; getline( cin , Name) ;
if ( Name == "Erdos, P." ) { puts ( "Erdos, P. 0" ) ; continue ; }
else {
int Num = BFS( MP( "Erdos, P." , 0 ) , Name) ;
( Num) ? printf ( "%s %d\n " , Name.c_str ( ) , Num) : printf ( "%s infinity\n " , Name.c_str ( ) ) ;
}
}
}
return 0 ;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxiaXRzZXQ+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBNLCBOLCBYOwojZGVmaW5lIEZPUihpLCBOKSBmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQojZGVmaW5lIEZPUjFlKGksIE4pIGZvcihpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKQojZGVmaW5lIFJFUChpLCBYLCBOKSBmb3IoaW50IGkgPSBYOyBpIDwgTjsgaSsrKQojZGVmaW5lIFJFUDFlKGksIFgsIE4pIGZvcihpbnQgaSA9IFg7IGkgPD0gTjsgaSsrKQojZGVmaW5lIFNDQU4oTikgc2NhbmYoIiVkIiwgJk4pCiNkZWZpbmUgU0NBTl8yKE4sIFgpIHNjYW5mKCIlZCAlZCIsICZOLCAmWCkKI2RlZmluZSBQQUlSIHBhaXIgPHN0cmluZywgaW50PgojZGVmaW5lIElUUiBtYXAgPFBBSVIsIHZlY3RvciA8UEFJUiA+ID46Oml0ZXJhdG9yCiNkZWZpbmUgTVAgbWFrZV9wYWlyCiNkZWZpbmUgUFAgcHVzaF9iYWNrCgpib29sIFZpc1s1MDEwXTsKbWFwIDxQQUlSLCB2ZWN0b3IgPFBBSVIgPiA+IEFkakxpc3Q7CgojZGVmaW5lIEFsbChpdCwgQWRqTGlzdCkgZm9yKElUUiBpdCA9IEFkakxpc3QuYmVnaW4oKTsgaXQgIT0gQWRqTGlzdC5lbmQoKTsgaXQrKykKCmludCBCRlMoUEFJUiBzLCBzdHJpbmcgZCl7CglxdWV1ZSA8UEFJUj4gcTsgcS5wdXNoKHMpOwoJUEFJUiBjdXIgPSBzOyBWaXNbMF0gPSAxOwoJaW50IHN6ID0gMSwgQ250ID0gMTsKCXdoaWxlKHEuc2l6ZSgpKXsKCQl3aGlsZShzei0tKXsKCQkJY3VyID0gcS5mcm9udCgpOyBxLnBvcCgpOwoJCQlGT1IoaSwgQWRqTGlzdFtjdXJdLnNpemUoKSl7CgkJCQlQQUlSIGNoaWxkID0gQWRqTGlzdFtjdXJdW2ldOwoJCQkJaWYoY2hpbGQuZmlyc3QgPT0gZCkgCgkJCQkJcmV0dXJuIENudDsKCQkJCWlmKCFWaXNbY2hpbGQuc2Vjb25kXSl7CgkJCQkJVmlzW2NoaWxkLnNlY29uZF0gPSAxOwoJCQkJCXEucHVzaChjaGlsZCk7CgkJCQl9CgkJCX0KCQl9CgkJc3ogPSBxLnNpemUoKTsgQ250Kys7Cgl9CglyZXR1cm4gMDsKfQoKaW50IG1haW4oKXsKLy8JZnJlb3BlbigiaW4udHh0IiwgInIiLCBzdGRpbik7CglpbnQgVDsgU0NBTihUKTsKCXdoaWxlKFQtLSl7CgkJQWRqTGlzdC5jbGVhcigpOyBBZGpMaXN0W01QKCJFcmRvcywgUC4iLCAwKV0uY2xlYXIoKTsKCQlTQ0FOXzIoTSwgTik7IGNpbi5pZ25vcmUoKTsKCQlpbnQgaW5kZXggPSAxOwoJCXdoaWxlKE0tLSl7CgkJCXN0cmluZyBMaW5lOyBnZXRsaW5lKGNpbiwgTGluZSk7CgkJCXN0cmluZ3N0cmVhbSBTUyhMaW5lKTsKCQkJdmVjdG9yIDxzdHJpbmc+IFdvcmRzLCBOb2RlczsKCQkJaW50IGkgPSAwOwoJCQlib29sIEVuZCA9IDA7CgkJCWZvcihzdHJpbmcgeDsgU1MgPj4geDsgaSsrKXsKCQkJCVdvcmRzLnB1c2hfYmFjayh4KTsKCQkJCWlmKGklMil7CgkJCQkJaWYoV29yZHNbaV1bV29yZHNbaV0uc2l6ZSgpLTFdID09ICc6JykgRW5kID0gMTsKCQkJCQlXb3Jkc1tpXS5lcmFzZShXb3Jkc1tpXS5zaXplKCktMSwgMSk7CgkJCQkJV29yZHNbaS0xXSArPSAnICcrV29yZHNbaV07CgkJCQkJTm9kZXMucHVzaF9iYWNrKFdvcmRzW2ktMV0pOwoJCQkJCWlmKEVuZCkgYnJlYWs7CgkJCQl9CgkJCX0KCQkJRk9SKGksIE5vZGVzLnNpemUoKS0xKQoJCQkJUkVQKGosIGkrMSwgTm9kZXMuc2l6ZSgpKXsKCQkJCQlib29sIEYgPSAwOwoJCQkJCVBBSVIgeChNUChOb2Rlc1tpXSwgaSkpLCB5KE1QKE5vZGVzW2pdLCBqKSk7CgkJCQkJQWxsKGl0LCBBZGpMaXN0KXsKCQkJCQkJaWYoaXQtPmZpcnN0LmZpcnN0ID09IHguZmlyc3QpCgkJCQkJCXt4LnNlY29uZCA9IGl0LT5maXJzdC5zZWNvbmQ7IEYgPSAxOyBicmVhazt9CgkJCQkJfQovLwkJCQkJKEYpID8gRiA9IDAgOiB4LnNlY29uZCA9PSBpbmRleCsrOwoJCQkJCWlmKEYpIEYgPSAwOyBlbHNlIHguc2Vjb25kID0gaW5kZXgsIGluZGV4Kys7CgkJCQkJQWxsKGl0LCBBZGpMaXN0KXsKCQkJCQkJaWYoaXQtPmZpcnN0LmZpcnN0ID09IHkuZmlyc3QpCgkJCQkJCXt5LnNlY29uZCA9IGl0LT5maXJzdC5zZWNvbmQ7IEYgPSAxOyBicmVhazt9CgkJCQkJfQoJCQkJCWlmKEYpIEYgPSAwOyBlbHNlIHkuc2Vjb25kID0gaW5kZXgsIGluZGV4Kys7CgkJCQkJQWRqTGlzdFt4XS5wdXNoX2JhY2soeSk7IEFkakxpc3RbeV0ucHVzaF9iYWNrKHgpOyAKCQkJfQoJCX0KCQl3aGlsZShOLS0pewoJCQltZW1zZXQoVmlzLCAwLCBBZGpMaXN0LnNpemUoKSs1KTsKCQkJc3RyaW5nIE5hbWU7IGdldGxpbmUoY2luLCBOYW1lKTsKCQkJaWYoTmFtZSA9PSAiRXJkb3MsIFAuIikge3B1dHMoIkVyZG9zLCBQLiAwIik7IGNvbnRpbnVlO30KCQkJZWxzZXsKCQkJCWludCBOdW0gPSBCRlMoTVAoIkVyZG9zLCBQLiIsIDApLCBOYW1lKTsKCQkJCShOdW0pID8gcHJpbnRmKCIlcyAlZFxuIiwgTmFtZS5jX3N0cigpLCBOdW0pIDogcHJpbnRmKCIlcyBpbmZpbml0eVxuIiwgTmFtZS5jX3N0cigpKTsKCQkJfQoJCX0KCX0KCXJldHVybiAwOwp9
stdin
MQo0IDMKU21pdGgsIE0uTi4sIE1hcnRpbiwgRy4sIEVyZG9zLCBQLjogTmV3dG9uaWFuIGZvcm1zIG9mIHByaW1lIGZhY3RvciBtYXRyaWNlcyAKRXJkb3MsIFAuLCBSZWlzaWcsIFcuOiBTdHV0dGVyaW5nIGluIHBldHJpIG5ldHMKU21pdGgsIE0uTi4sIENoZW4sIFguOiBGaXJzdCBvZGVyIGRlcml2YXRlcyBpbiBzdHJ1Y3R1cmVkIHByb2dyYW1taW5nCkphYmxvbnNraSwgVC4sIEhzdWVoLCBaLjogU2VsZnN0YWJpbGl6aW5nIGRhdGEgc3RydWN0dXJlcwpTbWl0aCwgTS5OLgpIc3VlaCwgWi4KQ2hlbiwgWC4=
1
4 3
Smith, M.N., Martin, G., Erdos, P.: Newtonian forms of prime factor matrices
Erdos, P., Reisig, W.: Stuttering in petri nets
Smith, M.N., Chen, X.: First oder derivates in structured programming
Jablonski, T., Hsueh, Z.: Selfstabilizing data structures
Smith, M.N.
Hsueh, Z.
Chen, X.