#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int c[502];
long long int d[502][502];
int tpye[100005];
int par[100005];
int rnk[100005];
void init() {
  for (int i = 0; i <= n; i++) par[i] = i;
}
int F(const int& u) {
  if (par[u] != u) par[u] = F(par[u]);
  return par[u];
}
void Merge(const int& u, const int& v) {
  int xroot = F(u), yroot = F(v);
  if (xroot == yroot) return;
  if (rnk[xroot] > rnk[yroot])
    par[yroot] = xroot;
  else if (rnk[yroot] > rnk[xroot])
    par[xroot] = yroot;
  else
    par[xroot] = yroot, rnk[xroot]++;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  init();
  for (int i = 1; i <= k; i++) scanf("%d", c + i);
  int l = 1, ptr = 1, u, v, x;
  while (l <= n and ptr <= k) {
    int r = l;
    while (r <= n and r <= l + c[ptr] - 1) tpye[r] = ptr, r++;
    l = r;
    ptr++;
  }
  for (int i = 0; i <= k; i++)
    for (int j = 0; j <= k; j++)
      if (i != j) d[i][j] = -1;
  while (m--) {
    scanf("%d%d%d", &u, &v, &x);
    if (d[tpye[u]][tpye[v]] == -1) {
      d[tpye[u]][tpye[v]] = x;
      d[tpye[v]][tpye[u]] = x;
    } else {
      d[tpye[u]][tpye[v]] = min(d[tpye[u]][tpye[v]], 1ll * x);
      d[tpye[v]][tpye[u]] = d[tpye[u]][tpye[v]];
    }
    if (x == 0) Merge(u, v);
  }
  bool correct = true;
  for (int i = 1; i <= n and correct; i++)
    if (tpye[i] == tpye[i + 1]) correct &= (F(i) == F(i + 1));
  if (!correct) cout << "No\n", exit(0);
  for (int l = 1; l <= k; l++)
    for (int i = 1; i <= k; i++)
      for (int j = 1; j <= k; j++) {
        if (d[i][l] == -1 or d[l][j] == -1) continue;
        if (d[i][j] == -1)
          d[i][j] = d[i][l] + d[l][j];
        else
          d[i][j] = min(d[i][j], d[i][l] + d[l][j]);
      }
  printf("Yes\n");
  for (int i = 1; i <= k; i++, printf("\n"))
    for (int j = 1; j <= k; j++) printf("%I64d ", d[i][j]);
  return 0;
}
