//这道题遇到的各种挫折花了我两天足以让我写下上千字的反思,现在终于全部通过了,简单说一下经验

/*
当输出为空、输出和预期相差十万八千里时的办法:
1、查看题目的输入,接收输入的时候是否有细节没考虑到:
有的的字符串内部可能有空,要用getline(cin,str)

2、用例不支持查看
可以打印通过输出的方法,查看不通过用例的完整输入

3、没有测试用例
考虑一些极端情况,示例里没考虑到的情况,设计用例

其他经验:
类似本题,当想重新定义一个字符串(数组)存全部小写的字符串时:
要先给strr=str;先给strr整体赋值,并且长度相等。*********************
然后调整内部的字母大小写**********************

str.find(']');此函数只返回第一个]出现的位置
*/


#include <iostream>
#include <string>
using namespace std;
string str[1001];
string text;
string strr[1001];//转为小写后的模式串数组
string textt;//转为小写后的文本串

int main() {
    int num;
    while(cin>>num)
    {    
    //string kong;//第一行num后面有个换行符没接受    
   // getline(cin,kong);

    for(int i=1;i<=num;i++)
    {
        cin>>str[i];
        //getline(cin,str[i]);
        strr[i]=str[i];//!!!!!!!
        int len=str[i].size();
		for(int j=0;j<len;j++)
		{
			if(str[i][j]>='A'&&str[i][j]<='Z')strr[i][j]=str[i][j]+32;
			else
			{
				strr[i][j]=str[i][j];
			}
		} 


 //       cout<<"str"<<i<<str[i]<<"   strr"<<i<<strr[i]<<endl;////

    }


    cin>>text;
    //getline(cin,text);
    int n=text.size();
    textt=text;//一定要加!!!**********************

	for(int j=0;j<n;j++)
	{
		if(text[j]>='A'&&text[j]<='Z')
		{
			textt[j]=text[j]+32;
		}
		else{
			textt[j]=text[j];
		}
	}

/////    cout<<"text:"<<text<<"   textt:"<<textt<<endl;////


    for(int i=1;i<=num;i++)//对每个模式串检验
    {
        //文本串没有[],模式串匹配
        int find=text.find("[");
        
        if(find==string::npos&&strr[i]==textt)
        {
                cout<<i<<" "<<str[i]<<endl;
                break;
        }

        //文本串有多个[]
        int m=str[i].size();
        int n=textt.size();
        int k=0;//当前模式串的下标
        int flag=1;//当前模式串匹配
        int j;//文本串的下标
        for( j=0;j<n;j++)//文本串的下标
        {
            if(textt[j]!='[')//没进入[]
            {
                if(strr[i][k]==textt[j])
                {
                    k++;
                    flag=1;
                }
                else
                {
                    flag=0;//模式串不匹配
                    break;
                }
            }
            else//文本串[]内的匹配
            {
                j++;
                while(textt[j]!=']')
                {
                    if(strr[i][k]!=textt[j])
                    {
                        j++;
                        flag=0;
                    }
                    else {//匹配上了
                        k++;
                        int tmplen=n-j;
                        string tmp=textt.substr(j,tmplen);
                        j=tmp.find(']')+j;//这句话一定要有,否则每次找的都是第一个]的下标
                      //  j=textt.find(']');
                        
                      //  cout<<"] at "<<j<<endl;
                        flag=1;///////!!!!!!!!这个一定要加
                        break;
                    }
                }

                if(flag==0&&textt[j]==']')//括号里都不匹配,那就对下一个模式串进行检验
                {
                 //   cout<<"括号里都不匹配"<<"  ";///////////////
                    break;//检验下一个模式串去
                }
            }

        }//和文本串一一校对



        if(flag==1&&j==n&&k==m)//条件别漏了
        {
            cout<<i<<" "<<str[i]<<endl;//每个都输出
            
        }
//        else  cout<<i<<" f0 "<<str[i]<<endl;       

    }//检验下一个模式串

    }
}