#8 #9 #10 WA
#include<iostream>
#include<vector>
#include<map>
#define str std::string
#define rp(i,p,n,k) for(int (i)=(p);(i)<(n);(i)+=(k))
#define gli(x) getline(std::cin,x)
#define vc std::vector
#define pb push_back
#define cot continue
#define br break
#define sz size()
bool chk_macn(char x){
return (isdigit(x)||isalpha(x)||x=='_');
}
struct Define{
bool has;
int start_line;
int end_line;
str repl;
bool und;
};
std::map<str,bool>vis;
std::map<str,Define>mp;
void dfs(str x,int le){
str zm;
x+=" ";
rp(i,0,x.sz,1){
if(chk_macn(x[i])){
zm+=x[i];
}else{
if(mp[zm].has==0){
std::cout<<zm;
}else if((le<mp[zm].start_line||mp[zm].end_line<le)||(!mp[zm].und&&le<mp[zm].start_line)){
std::cout<<zm;
}else if(vis[zm]){
std::cout<<zm;
}else{
vis[zm]=1;
dfs(mp[zm].repl,le);
vis[zm]=0;
}
zm="";
if(i!=x.sz-1&&x[i])std::cout<<x[i];
}
}
}
int main(){
int n;
std::cin>>n;
getchar();
vc<str>prog;
rp(i,0,n,1){
str a;
gli(a);
prog.pb(a);
}
rp(i,0,n,1){
if(prog[i].find('#')==-1)cot;
if(prog[i].find("#define")!=-1){
str name;
int sub_index;
rp(j,8,prog[i].sz,1){
if(prog[i][j]==' '){
sub_index=j+1;
br;
}
name+=prog[i][j];
}
str comment=prog[i].substr(sub_index);
mp[name]={1,i,n,comment,0};
}else{
str name=prog[i].substr(7);
mp[name].end_line=i;
mp[name].und=true;
}
prog[i]="";
}
rp(i,0,n,1){
if(!prog[i].sz){
puts("");
cot;
}
dfs(prog[i],i);
puts("");
}
}