#include <map>
#include <set>
#include <iostream>
#include <string>
using namespace std;

struct _Key
{
  string State;
  string c;
  bool operator< (const _Key& k) const
  { 
    if(this->State==k.State)
      return this->c<k.c;
    else
      return this->State<k.State;
  }
};

int main(void)
{
  map<_Key,set<string> > nfa;
  set<string> end;
  set<string> states;
  map<string, set<string> > eeeps;
  string begin;
  string s;
  while(true)
  {
    _Key key;
    string newstate;
    cin>>key.State;
    if(key.State=="END")
      break;
    cin>>key.c>>newstate;
    nfa[key].insert(newstate);
    states.insert(key.State);
    states.insert(newstate);
  }

  set<string> unvisited;
  set<string> newunvisited;
  _Key key;
  key.c="eps";
  for(set<string>::iterator i=states.begin(); i!=states.end(); i++)
  {
    unvisited.insert(*i);
    while(unvisited.size()>0)
    {
      for(set<string>::iterator j=unvisited.begin(); j!=unvisited.end(); j++)
      {
        key.State=*j;
        for(set<string>::iterator k=nfa[key].begin(); k!=nfa[key].end(); k++)
        {
          if(eeeps[*i].find(*k)==eeeps[*i].end())
          {
            eeeps[*i].insert(*k);
            newunvisited.insert(*k);
          }
        }
      }
      unvisited=newunvisited;
      newunvisited.clear();
    }
  }

  /*
  for(set<string>::iterator i=states.begin(); i!=states.end(); i++)
  {
    cout<<*i<<"->EPS->(";
    for(set<string>::iterator j=eeeps[*i].begin(); j!=eeeps[*i].end(); j++)
      cout<<*j<<",";
    cout<<"0)\n";
  }
  */


  while(true)
  {
    string state;
    cin>>state;
    if(state=="END")
      break;
    end.insert(state);
  }
  cin>>begin;
  cin>>s;
  set<string> States, NewStates;
  States.insert(begin);
  for(set<string>::iterator j=States.begin(); j!=States.end(); j++)
  {
    for(set<string>::iterator k=eeeps[*j].begin(); k!=eeeps[*j].end(); k++)
      NewStates.insert(*k);
  }
  States=NewStates;
  States.insert(begin);
  NewStates.clear();

  for(int i=0; i<s.size(); i++)
  {
    for(set<string>::iterator j=States.begin(); j!=States.end(); j++)
    {
      key.State=*j;
      key.c=s[i];
      for(set<string>::iterator k=nfa[key].begin(); k!=nfa[key].end(); k++)
        NewStates.insert(*k);
    }
    for(set<string>::iterator j=NewStates.begin(); j!=NewStates.end(); j++)
    {
      for(set<string>::iterator k=eeeps[*j].begin(); k!=eeeps[*j].end(); k++)
        NewStates.insert(*k);
    }
    if(NewStates.size()>0)
    {
      States=NewStates;
      NewStates.clear();
    }
    else
    {
      cout<<0<<'\n'<<i;
      return 0;
    }
  }
  bool possible=false;
  for(set<string>::iterator i=States.begin(); i!=States.end(); i++)
    if(end.find(*i)!=end.end())
    {
      possible=true;
      break;
    }
  if(!possible)
    cout<<0<<'\n'<<s.size();
  else
    cout<<1<<'\n'<<s.size();
  return 0;
}
