#include <bits/stdc++.h>
using namespace std;
int N, M, K, T = 1, c[505], t[100100], adj[505][505];
struct UF {
  int p[100100];
  void init() {
    for (int i = 1; i <= (N); i++) p[i] = i;
  }
  int g(int i) { return p[i] == i ? i : p[i] = g(p[i]); }
} U;
int main() {
  scanf("%d %d %d", &N, &M, &K);
  U.init();
  for (int i = 1; i <= (K); i++) {
    scanf("%d", &c[i]);
    for (int j = T; j < T + c[i]; j++) t[j] = i;
    T += c[i];
  }
  for (int i = 1; i <= (K); i++)
    for (int j = 1; j <= (K); j++) adj[i][j] = 1e9;
  for (int i = 1; i <= (K); i++) adj[i][i] = 0;
  for (int i = 1; i <= (M); i++) {
    int u, v, x;
    scanf("%d %d %d", &u, &v, &x);
    if (!x) U.p[U.g(u)] = U.g(v);
    adj[t[u]][t[v]] = min(adj[t[u]][t[v]], x);
    adj[t[v]][t[u]] = min(adj[t[v]][t[u]], x);
  }
  T = 1;
  for (int i = 1; i <= (K); i++) {
    int cur = U.g(T);
    for (int j = T; j < T + c[i]; j++) {
      if (U.g(j) != cur) {
        puts("No");
        return 0;
      }
    }
    T += c[i];
  }
  puts("Yes");
  for (int m = 1; m <= (K); m++)
    for (int s = 1; s <= (K); s++)
      for (int e = 1; e <= (K); e++) {
        adj[s][e] = min(adj[s][e], adj[s][m] + adj[m][e]);
      }
  for (int i = 1; i <= (K); i++) {
    for (int j = 1; j <= (K); j++) {
      printf("%d ", adj[i][j] == 1e9 ? -1 : adj[i][j]);
    }
    puts("");
  }
  return 0;
}
