#include <bits/stdc++.h>
using namespace std;
int parent[100005], c[100005];
vector<pair<int, int> > graph[100005];
int dist[505][505];
set<pair<int, int> > dijkstra;
int find(int x) {
  if (x != parent[x]) parent[x] = find(parent[x]);
  return parent[x];
}
void dfs(int v, int d, int sum, int p) {
  dist[d][v] = sum;
  for (int i = 0; i < graph[v].size(); i++) {
    int u = graph[v][i].first, w = graph[v][i].second;
    if (u != p) dfs(u, d, sum + w, v);
  }
}
int main() {
  int n, m, k;
  scanf("%d %d %d", &n, &m, &k);
  vector<int> num(k);
  for (int i = 0; i < k; i++) {
    scanf("%d", &num[i]);
    if (m == 0 && num[i] > 1) {
      printf("No\n");
      return 0;
    }
    num[i] += i > 0 ? num[i - 1] : 0;
  }
  pair<int, pair<int, int> > edge[m];
  for (int i = 0; i < m; i++)
    scanf("%d %d %d", &edge[i].second.first, &edge[i].second.second,
          &edge[i].first);
  sort(edge, edge + m);
  for (int i = 1; i <= n; i++) parent[i] = i;
  for (int i = 0; i < m; i++) {
    int a, b, w;
    a = edge[i].second.first, b = edge[i].second.second, w = edge[i].first;
    int x, y, c, d;
    c = (int)(lower_bound(num.begin(), num.end(), a) - num.begin());
    d = (int)(lower_bound(num.begin(), num.end(), b) - num.begin());
    if (w == 0) {
      x = find(a), y = find(b);
      if (x != y) parent[y] = x;
    }
  }
  int j = 1;
  for (int i = 0; i < k; i++) {
    set<int> Set;
    while (j <= num[i]) {
      int x = find(j);
      Set.insert(x);
      j++;
    }
    if (Set.size() > 1) {
      printf("No\n");
      return 0;
    }
  }
  for (int i = 0; i < m; i++) {
    int a, b, w;
    a = edge[i].second.first, b = edge[i].second.second, w = edge[i].first;
    int x, y, c, d;
    c = (int)(lower_bound(num.begin(), num.end(), a) - num.begin());
    d = (int)(lower_bound(num.begin(), num.end(), b) - num.begin());
    if (c == d) continue;
    a = c + 1, b = d + 1;
    graph[a].push_back(make_pair(b, w)), graph[b].push_back(make_pair(a, w));
  }
  for (int i = 1; i <= k; i++)
    for (int j = 1; j <= k; j++) dist[i][j] = (i == j) ? 0 : 1000000007;
  for (int i = 1; i <= k; i++) {
    dijkstra.insert(make_pair(0, i));
    dist[i][i] = 0;
    while (!dijkstra.empty()) {
      pair<int, int> s = *dijkstra.begin();
      dijkstra.erase(s);
      int v, d;
      v = s.second, d = s.first;
      for (int j = 0; j < graph[v].size(); j++) {
        int u = graph[v][j].first, w = graph[v][j].second;
        if (dist[i][u] == 1000000007) {
          dist[i][u] = d + w;
          dijkstra.insert(make_pair(d + w, u));
        } else if (dist[i][u] > d + w) {
          dijkstra.erase(make_pair(dist[i][u], u));
          dist[i][u] = d + w;
          dijkstra.insert(make_pair(dist[i][u], u));
        }
      }
    }
  }
  printf("Yes\n");
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= k; j++)
      printf("%d ", dist[i][j] == 1000000007 ? -1 : dist[i][j]);
    printf("\n");
  }
  return 0;
}
