#include<iostream>
using namespace std;
//邻接矩阵需要顶点表,二维矩阵,还有点数边数
#define MVNum 100
typedef struct
{
char vexs[MVNum]; //顶点表
int arcs[MVNum][MVNum]; //矩阵
int vexnum,arcnum; //顶点数、边数
}AMGraph;
int LocateVex(AMGraph G,char v)
{//找到顶点在顶点表中的位置
for(int i=0;i<G.vexnum;++i)
if(G.vexs[i]==v)return i;
return -1;
}
void Create(AMGraph &G,int &error)
{//创建有向图
cin>>G.vexnum>>G.arcnum; //输入顶点数和边数
for(int i=0;i<G.vexnum;++i) cin>>G.vexs[i]; //顶点信息
for(int i=0;i<G.vexnum;++i)
for(int j=0;j<G.vexnum;++j) G.arcs[i][j]=0; //有向图初始化为0
for(int k=0;k<G.arcnum;++k) //邻接矩阵信息
{ char v1,v2;
cin>>v1>>v2;
int i=LocateVex(G,v1),j=LocateVex(G,v2); //邻接矩阵只需要修改一下a[i][j]
if(i==-1||j==-1) error=0; //输入的顶点不合法
else G.arcs[i][j]=1; //有向图
}
}
int main()
{
AMGraph G;
int error=1; //输入的顶点无误:1有误:0
Create(G,error);
if(G.vexnum==0||(G.vexnum==1&&G.arcnum>1)||error==0)
//若顶点个数为0,则输出"error"。若顶点个数为1,边个数不合理,则输出"error"
cout<<"error";
else{
for(int i=0;i<G.vexnum;++i){
for(int j=0;j<G.vexnum;++j){
cout<<G.arcs[i][j];
if(j!=G.vexnum-1)cout<<" ";
else cout<<endl;
}
}
}
return 0;
}