//有向图的邻接表实现
#include<iostream>
using namespace std;

struct ENode//定义弧的结构体 
{
    int adjvex;//某弧所指向顶点的下标
    ENode* next;//指向下一条弧
    int weight; //弧上的权重 
 };
 
 struct VNode{//顶点的结构体类型 
     char data;//顶点信息 
     ENode* first ;//指向第一条依附该顶点的弧 
 };
 
 struct ALGraph{//图的邻接表 
     VNode *V;//顶点数组 
     int vexnum;//顶点数 
     void InitG(int num);//初始化 
     void InsertArc(int from,int to,int weight);//插入弧 
     void DeleteArc(int from,int to);//删除弧 
     void Traverse();//逐个顶点输出各边 
 };
 
 
 int main(){
     ALGraph g;
     int n,m,w;
     char a,b; 
     
     cin>>n>>m;//顶点数n,边数m 
     g.InitG(n);//简历一个n个顶点的链接表 
     
     for(int i=0;i<m;i++)//数据域输进去,指针域置为空指针 
     {
         cin>>a>>b>>w;//a到b有边权值是w 
         g.InsertArc(a-'a',b-'a',w);//字符转化为对应的下标 
         //g.insertArc(b-'a',a-'a',w);//无向图增加此句 
     }
     g.Traverse();
     
     cin>>a>>b;
     g.DeleteArc(a-'a',b-'a');
     // g.DeleteArc(a-'a',b-'a',w);//无向图增加此句 
    g.Traverse();
    
    return 0;
 } 
 
 
 void ALGraph::InitG(int num)//初始化一个顶点总数为num的图 
 {
     vexnum=num;
     V=new VNode[vexnum];//申请一个vexnum这么大的数组由V来指向 
     for(int i=0;i<vexnum;i++)
     {
         V[i].first=NULL;//first指针域设为空指针 
         cin>>V[i].data;//输入数据域 
     }
 }
 
 void ALGraph::InsertArc(int from,int to,int weight)//起点,终点,权值 
 {
     ENode *s=new ENode;
     s->adjvex=to;//s对应的链接点下标设为to 
     s->weight=weight;
     s->next=V[from].first;//新节点s插到链表vertices[v] 的头 
     V[from].first=s;
 }
 
 void ALGraph::DeleteArc(int from,int to)//将弧<from,to>从图中删除 
 {
     ENode *p=V[from].first,*q=p;//还是节点的操作 
     while(p!=NULL)
     {
         if(p->adjvex==to) break;
         q=p;
         p=p->next;
     }
     if(q==p) V[from].first=p->next;
     else q->next=p->next;
     delete p;
 }
 
 void ALGraph::Traverse(){
 for(int i=0;i<vexnum;i++)
 {
     ENode *p=V[i].first;
     while(p!=NULL){//当链表还没结束时,将链表输出来 
         cout<<V[i].data<<"-->";
         cout<<V[p->adjvex].data<<endl;
         p=p->next;
     }
 }
 }