#include <bits/stdc++.h>
int x4[4] = {0, 0, -1, 1};
int y4[4] = {-1, 1, 0, 0};
int x8[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int y8[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
int xhorse[8] = {1, 2, 1, 2, -1, -2, -1, -2};
int yhorse[8] = {2, 1, -2, -1, 2, 1, -2, -1};
using namespace std;
int n, m, k;
int number[505];
int parent[100005];
int inset[100005];
vector<pair<pair<int, int>, int> > edgeList;
int mst[505];
int type[100005];
int pos;
bool valid;
int adjMatrix[505][505];
bool f(pair<pair<int, int>, int> a, pair<pair<int, int>, int> b) {
  return a.second < b.second;
}
int find(int x) {
  if (parent[x] == -1)
    return x;
  else
    return find(parent[x]);
}
int find2(int x) {
  if (parent[x] == -1)
    return x;
  else if (inset[parent[x]] != -1)
    return inset[parent[x]];
  else
    return find2(parent[x]);
}
bool check() {
  memset(inset, -1, sizeof(inset));
  for (int i = 1; i <= n; i++) inset[i] = find2(i);
  int node = 1;
  int curset;
  for (int i = 1; i <= k; i++) {
    curset = inset[node];
    for (int j = 0; j < number[i]; j++) {
      if (inset[node] != curset) return false;
      node++;
    }
  }
  return true;
}
int main() {
  memset(adjMatrix, -1, sizeof(adjMatrix));
  memset(mst, 0, sizeof(mst));
  memset(parent, -1, sizeof(parent));
  edgeList.clear();
  scanf("%d %d %d", &n, &m, &k);
  for (int i = 1; i <= k; i++) scanf("%d", &number[i]);
  pos = 1;
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= number[i]; j++) {
      type[pos] = i;
      pos++;
    }
  }
  for (int i = 0; i < m; i++) {
    int u, v, w;
    scanf("%d %d %d", &u, &v, &w);
    edgeList.push_back(make_pair(make_pair(u, v), w));
    edgeList.push_back(make_pair(make_pair(v, u), w));
  }
  sort(edgeList.begin(), edgeList.end(), f);
  int ctr = 0;
  for (ctr = 0; ctr < edgeList.size(); ctr++) {
    pair<pair<int, int>, int> edge;
    edge = edgeList[ctr];
    int u = edge.first.first;
    int v = edge.first.second;
    int w = edge.second;
    if (w != 0) break;
    int xset = find(u);
    int yset = find(v);
    if (xset == yset) continue;
    parent[xset] = yset;
    int tu = type[u];
    int tv = type[v];
    if (tu != tv) {
      if (adjMatrix[tu][tv] == -1)
        adjMatrix[tu][tv] = adjMatrix[tv][tu] = w;
      else
        adjMatrix[tu][tv] = adjMatrix[tv][tu] = min(adjMatrix[tu][tv], w);
    }
  }
  valid = check();
  if (valid) {
    for (int i = 1; i <= k; i++) adjMatrix[i][i] = 0;
    for (int i = ctr; i < edgeList.size(); i++) {
      pair<pair<int, int>, int> edge;
      edge = edgeList[i];
      int u = edge.first.first;
      int v = edge.first.second;
      int w = edge.second;
      int tu = type[u];
      int tv = type[v];
      if (tu != tv) {
        if (adjMatrix[tu][tv] == -1)
          adjMatrix[tu][tv] = adjMatrix[tv][tu] = w;
        else
          adjMatrix[tu][tv] = adjMatrix[tv][tu] = min(adjMatrix[tu][tv], w);
      }
    }
    for (int l = 1; l <= k; l++) {
      for (int i = 1; i <= k; i++) {
        for (int j = 1; j <= k; j++) {
          if (adjMatrix[i][l] != -1 && adjMatrix[l][j] != -1) {
            if (adjMatrix[i][j] == -1 ||
                adjMatrix[i][j] > adjMatrix[i][l] + adjMatrix[l][j]) {
              adjMatrix[i][j] = adjMatrix[i][l] + adjMatrix[l][j];
            }
          }
        }
      }
    }
    printf("Yes\n");
    for (int i = 1; i <= k; i++) {
      for (int j = 1; j <= k; j++) {
        if (i == j)
          printf("0 ");
        else
          printf("%d ", adjMatrix[i][j]);
      }
      printf("\n");
    }
  } else
    printf("No\n");
  return 0;
}
