#include <bits/stdc++.h>
using namespace std;
using LL = long long int;
template <class TH>
void _dbg(const char *sdbg, TH h) {
  cerr << sdbg << "=" << h << "\n";
}
template <class TH, class... TA>
void _dbg(const char *sdbg, TH h, TA... a) {
  while (*sdbg != ',') cerr << *sdbg++;
  cerr << "=" << h << ",";
  _dbg(sdbg + 1, a...);
}
template <class T>
ostream &operator<<(ostream &os, vector<T> V) {
  os << "[";
  for (auto vv : V) os << vv << ",";
  return os << "]";
}
template <class L, class R>
ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.st << "," << P.nd << ")";
}
const int MAXN = 1e5 + 5;
vector<int> G[MAXN];
int M[503][503];
int ans[503][503];
int n, m, k;
vector<int> ranges = {0};
int l, r;
bool vis[MAXN];
int col[MAXN];
set<int> s;
int toFind = 0;
int act = 0;
void dfs(int w) {
  ++act;
  if (!s.count(col[w])) {
    int l = ranges[col[w] - 1] + 1;
    int r = ranges[col[w]];
    toFind += r - l + 1;
    s.insert(col[w]);
  }
  vis[w] = true;
  for (auto u : G[w]) {
    if (!vis[u]) {
      dfs(u);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m >> k;
  int sum = 0;
  for (int i = 0; i <= k; ++i) {
    for (int j = 0; j <= k; ++j) {
      M[i][j] = 1 << 30;
    }
  }
  for (int i = 1; i <= k; ++i) {
    int x;
    cin >> x;
    sum += x;
    ranges.push_back(sum);
  }
  for (int i = 1; i < (int)ranges.size(); ++i) {
    for (int k = ranges[i - 1] + 1; k <= ranges[i]; ++k) {
      col[k] = i;
    }
  }
  for (int i = 1; i <= m; ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    if (c == 0) {
      G[a].push_back(b);
      G[b].push_back(a);
    }
    a = col[a];
    b = col[b];
    M[a][b] = min(M[a][b], c);
    M[b][a] = min(M[b][a], c);
  }
  for (int c = 1; c < (int)ranges.size(); ++c) {
    l = ranges[c - 1] + 1;
    r = ranges[c];
    int cnt = 0;
    int start = 0;
    for (int i = l; i <= r; ++i) {
      cnt += vis[i] ? 1 : 0;
    }
    if (cnt != 0 && cnt != r - l + 1) {
      cout << "No" << endl;
      return 0;
    }
    if (!vis[l]) {
      act = 0;
      toFind = 0;
      dfs(l);
    }
    if (act != toFind) {
      cout << "No" << endl;
      return 0;
    }
  }
  for (int i = 1; i <= k; ++i) {
    for (int u = 1; u <= k; ++u) {
      for (int v = 1; v <= k; ++v) {
        if (M[u][i] != 1 << 30 && M[i][v] != 1 << 30) {
          M[u][v] = min(M[u][v], M[u][i] + M[i][v]);
        }
      }
    }
  }
  cout << "Yes" << endl;
  for (int i = 1; i <= k; ++i) {
    M[i][i] = 0;
    for (int j = 1; j <= k; ++j) {
      if (M[i][j] >= 1 << 30) {
        M[i][j] = -1;
      }
      cout << M[i][j] << " ";
    }
    cout << endl;
  }
}
