#include <bits/stdc++.h>
using namespace std;
typedef int tarr[100100];
tarr lab, a, c, f, dd;
int w[510][510];
int r, s, u, v, t, m, n, k, d, oo, wi;
int findset(int u) {
  int tmp;
  if (lab[u] <= 0)
    return u;
  else {
    tmp = findset(lab[u]);
    lab[u] = tmp;
  }
  return tmp;
}
int uni(int r, int s) {
  if (lab[r] < lab[s]) {
    lab[s] = r;
    f[r] += f[s];
  } else {
    if (lab[r] == lab[s]) lab[s]--;
    lab[r] = s;
    f[s] += f[r];
  }
  return 0;
}
int main() {
  cin >> n >> m >> k;
  d = 1;
  for (int i = 1; i <= k; i++) {
    cin >> c[i];
    for (int j = d; j <= d + c[i] - 1; j++) a[j] = i;
    d += c[i];
  }
  oo = 1000000000;
  for (int i = 1; i <= k; i++)
    for (int j = 1; j <= k; j++)
      if (i == j)
        w[i][j] = 0;
      else
        w[i][j] = oo;
  memset(lab, 0, sizeof(lab));
  for (int i = 1; i <= n; i++) f[i] = 1;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &u, &v, &wi);
    if (wi == 0) {
      r = findset(u);
      s = findset(v);
      uni(r, s);
    }
    {
      w[a[u]][a[v]] = min(w[a[u]][a[v]], wi);
      w[a[v]][a[u]] = min(w[a[v]][a[u]], wi);
    }
  }
  memset(dd, 0, sizeof(dd));
  for (int i = 1; i <= n; i++) {
    r = findset(i);
    if (dd[a[i]] == 0)
      dd[a[i]] = r;
    else if (dd[a[i]] != r) {
      cout << "No";
      exit(0);
    }
  }
  cout << "Yes\n";
  for (int t = 1; t <= k; t++)
    for (int i = 1; i <= k; i++)
      for (int j = 1; j <= k; j++) w[i][j] = min(w[i][j], w[i][t] + w[t][j]);
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= k; j++)
      if (w[i][j] < oo)
        printf("%d ", w[i][j]);
      else
        printf("-1 ");
    printf("\n");
  }
  return 0;
}
