#include <bits/stdc++.h>
using namespace std;
const int INF = 1e7;
const int MN = 2e5 + 7;
struct xyz {
  int x, y, z;
} r[MN];
int n, m, t;
int c[MN], s[MN], u[MN];
int f[1000][1000];
int getr(int s) {
  if (s != u[s]) u[s] = getr(u[s]);
  return u[s];
}
int gettype(int w) {
  for (int i = 1; i <= t; i++)
    if (s[i - 1] + 1 <= w && w <= s[i]) return i;
}
int main() {
  scanf("%d%d%d", &n, &m, &t);
  int i, j, k;
  for (i = 1; i <= t; i++) {
    scanf("%d", c + i);
    s[i] = s[i - 1] + c[i];
  }
  for (i = 1; i <= m; i++) {
    xyz w;
    scanf("%d%d%d", &w.x, &w.y, &w.z);
    r[i] = w;
  }
  for (i = 1; i <= n; i++) u[i] = i;
  for (i = 1; i <= m; i++) {
    if (r[i].z == 0) {
      int x = r[i].x;
      int y = r[i].y;
      if (getr(x) != getr(y)) u[u[x]] = u[y];
    }
  }
  for (i = 1; i <= n; i++) getr(i);
  j = 1;
  for (i = 2; i <= n; i++) {
    if (i > s[j])
      j++;
    else if (u[i] != u[i - 1]) {
      cout << "No" << endl;
      return 0;
    }
  }
  cout << "Yes" << endl;
  memset(f, 1, sizeof(f));
  for (i = 1; i <= t; i++) f[i][i] = 0;
  for (i = 1; i <= m; i++) {
    int u = gettype(r[i].x);
    int v = gettype(r[i].y);
    f[u][v] = min(f[u][v], r[i].z);
    f[v][u] = f[u][v];
  }
  for (k = 1; k <= t; k++)
    for (i = 1; i <= t; i++)
      for (j = 1; j <= t; j++)
        if (i != k && j != k && i != j)
          if ((long long)f[i][k] + f[k][j] < f[i][j]) {
            f[i][j] = f[i][k] + f[k][j];
            f[j][i] = f[i][j];
          }
  for (i = 1; i <= t; i++) {
    for (j = 1; j <= t; j++) {
      if (f[i][j] > INF)
        printf("-1");
      else
        printf("%d", f[i][j]);
      if (j != t) printf(" ");
    }
    puts("");
  }
  return 0;
}
