import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Templet {
static Scanner sc;
static int m,n;//模板的行数 模板生成是给定的变量的个数
static Map<String,String> map;
static List<String> list;
static int index1,index2,index3;
static String str1,str2,str3,strsrc,strdest,sub;
public static void main(String[] args) {
new Templet().run();
}
public static void run() {
sc = new Scanner(System.in);
list = new ArrayList<>();
map = new LinkedHashMap<>();
m = sc.nextInt();
n = sc.nextInt();
sc.nextLine();
//对输入的数据进行存储 模板用list存储
for(int i=0;i<m;i++) {
list.add(sc.nextLine());
}
//给定的变量以键值对的形式用map存储
for(int i=0;i<n;i++) {
String temp = sc.nextLine();
int index1 = temp.indexOf(" ");
String str1 = temp.substring(0,index1);
String str2 = temp.substring(index1+2, temp.length()-1);
map.put(str1, str2);
}
deal(list,map);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
public static void deal(List<String> lsit,Map<String,String> map) {
for (int i=0;i<list.size();i++) {
boolean flag = true;
while(flag) {
if(list.get(i).contains("{{")){
index1 = list.get(i).indexOf('{');
index2 = list.get(i).indexOf('}');
sub = list.get(i).substring(index1+3, index2-1); //取出标记
if(map.containsKey(sub)) { //判断给定标记中是否包含模板中的标记
//首先对第一个需要替换的标记进行替换
strsrc = list.get(i).replaceFirst(sub, map.get(sub));
//以下操作取出替换后的{{、}}以及空格
str1 = strsrc.substring(0, index1);
index3 = strsrc.indexOf('}');
str2 = strsrc.substring(index1+3,index3-1);
str3 = strsrc.substring(index3+2);
//最终第一个标记替换成功
strdest = str1+str2+str3;
list.remove(i);
list.add(i, strdest);
} else {
//如果不包含 那么不需要替换 只要取出{{、}}以及空格
str1 = list.get(i).substring(0, index1);
str3 = list.get(i).substring(index2+2);
strdest = str1+str3;
list.remove(i);
list.add(i,strdest);
}
} else {
/*
* 该行没有标记 退出while循环 判断下一行
*/
break;
}
}
}
}
}