#include <bits/stdc++.h>
using namespace std;
int inf = INT_MAX / 2;
int binary(int A[], int l, int r, int x) {
  int temp = -1;
  while (l <= r) {
    int mid = (l + r) / 2;
    if (A[mid] >= x)
      temp = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  return temp;
}
struct wunionfind {
  int id[100010], sz[100010];
  void initial(int n) {
    int i;
    for (i = 0; i <= n; i++) id[i] = i, sz[i] = 1;
  }
  int root(int idx) {
    int i = idx;
    while (i != id[i]) id[i] = id[id[i]], i = id[i];
    return i;
  }
  void uni(int a, int b) {
    int i = root(a), j = root(b);
    if (i != j) {
      if (sz[i] >= sz[j])
        id[j] = i, sz[i] += sz[j], sz[j] = 0;
      else
        id[i] = j, sz[j] += sz[i], sz[i] = 0;
    }
  }
  bool check(int a, int b) {
    if (root(a) == root(b))
      return true;
    else
      return false;
  }
} W;
int main() {
  int n, m, k;
  scanf("%d %d %d", &n, &m, &k);
  int D[k + 1][k + 1];
  for (int i = 0; i <= k; i++)
    for (int j = 0; j <= k; j++) D[i][j] = inf;
  int c[k + 1];
  c[0] = 0;
  for (int i = 1; i <= k; i++) {
    scanf("%d", &c[i]);
    if (c[i] == 1) D[i][i] = 0;
  }
  for (int i = 1; i <= k; i++) c[i] += c[i - 1];
  W.initial(n);
  for (int i = 0; i < m; i++) {
    int u, v, x;
    scanf("%d %d %d", &u, &v, &x);
    int T1 = binary(c, 1, k, u);
    int T2 = binary(c, 1, k, v);
    D[T1][T2] = min(D[T1][T2], x);
    D[T2][T1] = min(D[T2][T1], x);
    if (!x) W.uni(u, v);
  }
  int idx = 1;
  bool key = true;
  for (int i = 1; i < n; i++) {
    if (i > c[idx]) idx++;
    if (i + 1 <= c[idx]) {
      if (!W.check(i, i + 1)) {
        key = false;
        break;
      }
    }
  }
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= k; j++)
      for (int l = 1; l <= k; l++) D[j][l] = min(D[j][l], D[j][i] + D[i][l]);
  }
  for (int i = 1; i <= k; i++)
    if (D[i][i]) key = false;
  if (!key)
    printf("No\n");
  else {
    printf("Yes\n");
    for (int i = 1; i <= k; i++) {
      for (int j = 1; j <= k; j++)
        printf("%d ", (D[i][j] == inf ? -1 : D[i][j]));
      printf("\n");
    }
  }
  return 0;
}
