#include <iostream>
using namespace std;
int count1[100] = {0},count2[100] = {0};
typedef struct ArcNode{
int adjvex;
int weight;
ArcNode *next;
}ArcNode;
typedef struct VertexNode{
int vertex;
ArcNode *firstarc;
}VertexNode,AdjList[100];
typedef struct GraphAdjList{
AdjList adjlist;
int vexnum;
int arcnum;
}GraphAdjList;
void createGraphAdjList(GraphAdjList &G){
cin >> G.vexnum >> G.arcnum;
for(int i = 0; i < G.vexnum; i++){
cin >> G.adjlist[i].vertex;
G.adjlist[i].firstarc = NULL;
}
ArcNode *p;
for(int k = 0; k < G.arcnum; k++){
int i,j,w;
cin >> i >> j >> w;
p = new ArcNode;
p->adjvex = j;
p->weight = w;
p->next = G.adjlist[i].firstarc; //头插法
G.adjlist[i].firstarc = p;
}
}
void printfGraphAdjList(GraphAdjList G){
for(int i = 0; i < G.vexnum; i++){
ArcNode *p = G.adjlist[i].firstarc;
cout << G.adjlist[i].vertex << "\t";
while(p){
cout << p->adjvex << " " << p->weight << "\t";
p = p->next;
}
cout << endl;
}
}
int printfVertexNode(GraphAdjList G){
for(int i = 0; i < G.vexnum; i++){
ArcNode *p;
p = G.adjlist[i].firstarc;
while(p){
count1[G.adjlist[i].vertex]++;
count2[G.adjlist[p->adjvex].vertex]++;
p = p->next;
}
}
for(int i = 0; i < G.vexnum; i++){
cout << G.adjlist[i].vertex << " " << count1[G.adjlist[i].vertex] << " " << count2[G.adjlist[i].vertex] << endl;
}
}
int main(){
GraphAdjList G;
createGraphAdjList(G);
printfGraphAdjList(G);
printfVertexNode(G);
}