#include <bits/stdc++.h>
using namespace std;
int n, m, K;
int c[543];
int tot, head[100043], nxt[200043], to[200043], val[200043];
int type[100043];
bool vis[100043];
int cnt;
int dis[543][543];
void AddEdge(int u, int v, int x) {
  ++tot;
  nxt[tot] = head[u];
  to[tot] = v;
  val[tot] = x;
  head[u] = tot;
}
void Dfs(int u, int t) {
  vis[u] = true;
  if (type[u] == t) ++cnt;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i], x = val[i];
    if (!vis[v] && x == 0) {
      Dfs(v, t);
    }
  }
}
void Dfs2(int u) {
  vis[u] = true;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i], x = val[i];
    if (type[u] != type[v]) {
      dis[type[u]][type[v]] = min(dis[type[u]][type[v]], x);
      dis[type[v]][type[u]] = min(dis[type[v]][type[u]], x);
    }
    if (!vis[v]) {
      Dfs2(v);
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &K);
  int id = 1;
  for (int i = 1; i <= K; ++i) {
    scanf("%d", &c[i]);
    for (int j = id; j <= id + c[i] - 1; ++j) {
      type[j] = i;
    }
    id += c[i];
  }
  for (int i = 1; i <= m; ++i) {
    int u, v, x;
    scanf("%d%d%d", &u, &v, &x);
    AddEdge(u, v, x);
    AddEdge(v, u, x);
  }
  id = 1;
  bool flag = true;
  for (int i = 1; i <= K; ++i) {
    cnt = 0;
    memset(vis, false, sizeof(vis));
    Dfs(id, i);
    if (cnt < c[i]) flag = false;
    id += c[i];
  }
  if (!flag) {
    printf("No\n");
    return 0;
  }
  printf("Yes\n");
  memset(dis, 0x3f, sizeof(dis));
  memset(vis, false, sizeof(vis));
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      Dfs2(i);
    }
  }
  for (int k = 1; k <= K; ++k) {
    for (int i = 1; i <= K; ++i) {
      for (int j = 1; j <= K; ++j) {
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
      }
    }
  }
  for (int i = 1; i <= K; ++i) {
    for (int j = 1; j <= K; ++j) {
      if (i == j) {
        printf("0 ");
      } else {
        printf("%d ", (dis[i][j] == 0x3f3f3f3f ? -1 : dis[i][j]));
      }
    }
    printf("\n");
  }
  return 0;
}
