#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 80
#define INFINITY 1048576
typedef struct {
int distance;
int path;
}dist;
typedef struct {
int vj;
int weight;
}edge;
typedef struct {
char data[max][max];
int weight[max][max];
int vertexnum,arcnum;
}mgraph;
int crt(mgraph *G){
int i=0,j=0;
scanf("%d %d",&G->vertexnum,&G->arcnum);
for(i=0;i<G->vertexnum;i++){
scanf("%s",G->data[i]);
}
for(i=0;i<G->vertexnum;i++){
for(j=0;j<G->vertexnum;j++){
G->weight[i][j]=0;
}
}
char s1[max],s2[max];
int weight,m,n;
for(i=0;i<G->arcnum;i++){
scanf("%s %s %d",s1,s2,&weight);
for(j=0;j<G->vertexnum;j++){
if(strcmp(s1,G->data[j])==0)m=j;
if(strcmp(G->data[j],s2)==0)n=j;
}
G->weight[m][n]=G->weight[n][m]=weight;
}
return G->vertexnum;
}
void output(mgraph G){
int i,j;
for(i=0;i<G.vertexnum;i++){
printf("%s ",G.data[i]);
}
putchar('\n');
for(i=0;i<G.vertexnum;i++){
for(j=0;j<G.vertexnum;j++){
printf("%5d",G.weight[i][j]);
}
putchar('\n');
}
}
void DFS(mgraph G,char str[],int visited[]){
int j=0,v;
for(j=0;j<G.vertexnum;j++){
if(strcmp(str,G.data[j])==0)v=j;
}
printf("%s ",G.data[v]);
visited[v]=1;
for(j=0;j<G.vertexnum;j++){
if(G.weight[v][j]!=0&&visited[j]==0)DFS(G,G.data[j],visited);
}
}
void BFS(mgraph G,char str[],int visited[]){
int i,j=0,v,flag;
for(j=0;j<G.vertexnum;j++){
if(strcmp(str,G.data[j])==0)v=j;
}
if(visited[v]==0){
printf("%s ",G.data[v]);
visited[v]=1;
}
for(j=0;j<G.vertexnum;j++){
if(G.weight[v][j]!=0&&visited[j]==0){
printf("%s ",G.data[j]);
visited[j]=1;
}
}
for(j=0;j<G.vertexnum;j++){
flag=0;
if(G.weight[v][j]!=0){
for(i=0;i<G.vertexnum;i++){
if(visited[i]==0){
flag=1;
break;
}
}
if(flag)BFS(G,G.data[j],visited);
}
}
return ;
}
int select(mgraph G,edge lowcost[],int *m,int flag[]){
int i,temp=lowcost[0].weight,v;
for(i=0;i<G.vertexnum;i++){
if((!(flag[i]==1&&flag[lowcost[i].vj]==1))&&temp>lowcost[i].weight){
temp=lowcost[i].weight;
v=i;
(*m)=lowcost[i].vj;
}
}
return v;
}
void prim(mgraph G,edge lowcost[]){
int v=0,i,j,k=v,flag[G.vertexnum];
for(i=0;i<G.vertexnum;i++){
for(j=0;j<G.vertexnum;j++){
if(G.weight[i][j]==0)G.weight[i][j]=INFINITY;
}
}
for(i=0;i<G.vertexnum;i++){
flag[i]=0;
lowcost[i].weight=G.weight[v][i];
if(lowcost[i].weight==INFINITY)lowcost[i].vj=-1;
else lowcost[i].vj=v;
}
flag[v]=1;
for(i=0;i<G.vertexnum-1;i++){
k=select(G,lowcost,&v,flag);
printf("%s-%s %d\n",G.data[v],G.data[k],G.weight[v][k]);
flag[k]=1;
for(j=0;j<G.vertexnum;j++){
if(flag[j]==0&&G.weight[k][j]<lowcost[j].weight){
lowcost[j].weight=G.weight[k][j];
lowcost[j].vj=k;
}
}
}
return ;
}
int select1(mgraph G,dist dist[],int flag[]){
int i,temp,v;
for(i=0;i<G.vertexnum;i++){
if(flag[i]==0){
temp=dist[i].distance;
v=i;
break;
}
}
for(i=0;i<G.vertexnum;i++){
if((flag[i]==0)&&temp>dist[i].distance){
temp=dist[i].distance;
v=i;
}
}
return v;
}
void dijkstra(mgraph G,dist dist[],char str[]){
int flag[G.vertexnum];
int v,i,j,k;
for(i=0;i<G.vertexnum;i++){
if(strcmp(str,G.data[i])==0){
v=i;
break;
}
}
for(i=0;i<G.vertexnum;i++){
flag[i]=0;
for(j=0;j<G.vertexnum;j++){
if(i==j)continue;
if(G.weight[i][j]==0)G.weight[i][j]=INFINITY;
}
}
for(j=0;j<G.vertexnum;j++){
dist[j].distance=G.weight[v][j];
if(dist[j].distance==INFINITY||j==v)dist[j].path=-1;
else dist[j].path=v;
}
flag[v]=1;
for(i=0;i<G.vertexnum-1;i++){
k=select1(G,dist,flag);
flag[k]=1;
for(j=0;j<G.vertexnum;j++){
if(flag[j]==0&&dist[k].distance+G.weight[k][j]<dist[j].distance){
dist[j].distance=dist[k].distance+G.weight[k][j];
dist[j].path=k;
}
}
}
for(i=0;i<G.vertexnum;i++){
printf("%s %d\n",G.data[i],dist[i].distance);
}
return ;
}
int main(){
char ch,str[max];
mgraph G;
int i,vertexnum,visited[max]={0};
edge lowcost[max];
dist dist[max];
while(1){
ch=getchar();
switch(ch){
case 'c':
vertexnum=crt(&G);
break;
case 'o':
output(G);
break;
case 'd':
for(i=0;i<vertexnum;i++){
visited[i]=0;
}
scanf("%s",str);
DFS(G,str,visited);
putchar('\n');
break;
case 'b':
for(i=0;i<vertexnum;i++){
visited[i]=0;
}
scanf("%s",str);
BFS(G,str,visited);
putchar('\n');
break;
case 'p':
prim(G,lowcost);
break;
case 'j':
scanf("%s",str);
dijkstra(G,dist,str);
break;
case 'q':
printf("程序退出\n");
exit(0);
}
}
return 0;
}