#include <bits/stdc++.h>
using namespace std;
int64_t n, p, m, t, k, u, v, x, type[100001], d[501][501];
bool visn[100001], vist[501];
vector<pair<int64_t, int64_t>> G[100001];
set<int> rec;
void dfs(int64_t i) {
  if (vist[type[i]] && !rec.count(type[i])) {
    cout << "No";
    exit(0);
  }
  rec.insert(type[i]);
  vist[type[i]] = visn[i] = 1;
  for (auto j : G[i])
    if (!j.second && !visn[j.first]) dfs(j.first);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k;
  for (int64_t i = 1; i <= k; ++i) {
    cin >> t;
    for (int64_t j = p + 1; j <= p + t; ++j) type[j] = i;
    p += t;
  }
  for (int64_t i = 1; i <= k; ++i)
    for (int64_t j = 1; j <= k; ++j) d[i][j] = 2e9;
  for (int64_t i = 1; i <= m; ++i) {
    cin >> u >> v >> x;
    G[u].push_back({v, x});
    G[v].push_back({u, x});
    d[type[u]][type[v]] = min(d[type[u]][type[v]], x);
    d[type[v]][type[u]] = min(d[type[v]][type[u]], x);
  }
  for (int64_t i = 1; i <= n; ++i) {
    if (visn[i]) continue;
    if (vist[type[i]]) {
      cout << "No";
      return 0;
    }
    rec.clear();
    dfs(i);
  }
  cout << "Yes\n";
  for (int64_t i = 1; i <= k; ++i) d[i][i] = 0;
  for (int64_t x = 1; x <= k; ++x)
    for (int64_t y = 1; y <= k; ++y)
      for (int64_t z = 1; z <= k; ++z)
        d[y][z] = min(d[y][z], d[y][x] + d[x][z]);
  for (int64_t i = 1; i <= k; ++i, cout << '\n')
    for (int64_t j = 1; j <= k; ++j) {
      if (d[i][j] > 1e9) d[i][j] = -1;
      cout << d[i][j] << ' ';
    }
}
