#include <iostream>
using namespace std;
typedef struct EdgeBox{
int mark;
int ivex,jvex;
struct EdgeBox *ilink, *jlink;
int info;
}EdgeBox;
typedef struct VexBox{
int data;
EdgeBox *firstarc;
}VexBox;
typedef struct AdjMuList{
VexBox adjmulist[100];
int vexnum, arcnum;
}AdjMuList;
int LocateVex(AdjMuList G, int v){
for(int i = 0; i < G.vexnum; i++){
if(G.adjmulist[i].data == v){
return i;
}
}
return -1;
}
void createGraph(AdjMuList &G){
cin >> G.vexnum >> G.arcnum;
for(int i = 0; i < G.vexnum; i++){
cin >> G.adjmulist[i].data;
G.adjmulist[i].firstarc = NULL;
}
EdgeBox *p;
for(int k = 0; k < G.arcnum; k++){
int v1,v2;
cin >> v1 >> v2 >> p->info;
int m = LocateVex(G, v1);
int n = LocateVex(G, v2);
p = new EdgeBox;
p->mark = 0;//初始化为0,未访问过
p->ivex = v1;
p->jvex = v2;
p->ilink = G.adjmulist[m].firstarc;
G.adjmulist[m].firstarc = p;
p->jlink = G.adjmulist[n].firstarc;
G.adjmulist[n].firstarc = p;
}
}
void MarkUnvisited(AdjMuList G){
EdgeBox *p;
for(int i = 0; i < G.vexnum; i++){
p = new EdgeBox;
p = G.adjmulist[i].firstarc;
while(p){
p->mark = 0;
if(p->ivex == i){ //如果此条边是由顶点i发出的,则继续遍历i顶点的下一条邻边
p = p->ilink;
}else{
p = p->jlink;
}
}
}
}
void displayGraph(AdjMuList G){
MarkUnvisited(G);
EdgeBox *p;
for(int i = 0; i < G.vexnum; i++){
cout << G.adjmulist[i].data << ":";
p = new EdgeBox;
p = G.adjmulist[i].firstarc;
while(p){
if(p->ivex == i){
if(!p->mark){
cout << G.adjmulist[i].data << "-" << G.adjmulist[p->jvex].data << " " << p->info;
p->mark = 1;
}
p = p->ilink;
}else{
if(!p->mark){
cout << G.adjmulist[p->ivex].data << "-" << G.adjmulist[i].data << " " << p->info;
p->mark = 1;
}
p = p->jlink;
}
}
cout << endl;
}
}
int main(){
AdjMuList G;
createGraph(G);
displayGraph(G);
return 0;
}