#include <bits/stdc++.h>
using namespace std;
int n;
map<string,vector<string> >mp;
map<string,vector<string> >ans;
vector<string> getFirst(string lft){
vector<string>rgt,tmpans;
for(auto i : mp)if(i.first == lft)rgt = i.second;
for(auto s:rgt){
if(s[0]=='#')tmpans.push_back(s.substr(0,1));
else if(s[0]>='Z'||s[0]<='A'){
string tp = s.substr(0,1);
if(s[0]=='i'&&s[1]=='d')tp = s.substr(0,2);
tmpans.push_back(tp);
}
else {
string in = s.substr(0,2),in1 = s.substr(0,1);
vector<string>tmp;
if((int)s[1]==39)tmp = getFirst(in);
else tmp = getFirst(in1);
for(auto s1:tmp)tmpans.push_back(s1);
}
}
return tmpans;
}
int main(){
cout << "输入产生式个数:"<<endl;
cin >> n;
for(int i = 0;i < n;i++){
string s;
cin >> s;
int len = s.length(),j,l,r;
for(j = 0;j < len;j++){
if(s[j]=='-'&&s[j+1]=='>')break;
}
string left = s.substr(0,j);
vector<string>right;
for(l = j+2,r = j+2;r < len;r++){
if(s[r] == '|')right.push_back(s.substr(l,r-l)),l = r+1;
}
right.push_back(s.substr(l,r-l));
vector<string>nl;
if(mp[left]!=nl){
vector<string> temp = mp[left];
for(auto y:temp)right.push_back(y);
}
mp[left] = right;
}
for(auto i : mp){
vector<string> ansx = getFirst(i.first);
cout << i.first << " " ;
for(auto s:ansx)cout << s <<" ";
cout << endl;
}
return 0;
}
/*
E->TE'
E'->+TE'|#
T->FT'
T'->*FT'|#
F->(E)|id
*/