#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000000")
using namespace std;
const long long int INF = 2e9;
vector<int> nu[200000];
vector<pair<int, int> > vi[200000];
int used[200000];
void dfs(int id) {
  used[id]++;
  for (int i = 0; i < ((int)(nu[id]).size()); i++) {
    int to = nu[id][i];
    if (!used[to]) dfs(to);
  }
}
void deyk(int fr, int n) {
  vector<int> go(n, INF);
  go[fr] = 0;
  set<pair<int, int> > good;
  good.insert(make_pair(0, fr));
  while (!good.empty()) {
    int id = good.begin()->second;
    int dest = good.begin()->first;
    good.erase(good.begin());
    for (int i = 0; i < ((int)(vi[id]).size()); i++) {
      int to = vi[id][i].first;
      int d = vi[id][i].second;
      if (go[to] > dest + d) {
        auto it = good.find(make_pair(go[to], to));
        if (it != good.end()) good.erase(it);
        go[to] = dest + d;
        good.insert(make_pair(go[to], to));
      }
    }
  }
  for (int i = 0; i < (n); i++) {
    printf("%d ", go[i] == INF ? -1 : go[i]);
  }
  cout << endl;
}
int main() {
  int n, m, k;
  cin >> n >> m >> k;
  vector<int> c(k), is(n);
  for (int i = 0; i < (k); i++) cin >> c[i];
  int cur = c[0], ptr = 1;
  for (int i = 0; i < (n); i++) {
    if (i == cur) {
      cur += c[ptr++];
    }
    is[i] = ptr - 1;
  }
  for (int i = 0; i < (m); i++) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    a--;
    b--;
    if (!c) {
      nu[a].push_back(b);
      nu[b].push_back(a);
    }
    if (is[a] != is[b]) {
      vi[is[a]].push_back(make_pair(is[b], c));
      vi[is[b]].push_back(make_pair(is[a], c));
    }
  }
  cur = 0;
  for (int i = 0; i < (k); i++) {
    memset(used, 0, sizeof used);
    dfs(cur);
    for (int j = cur; j < cur + c[i]; j++) {
      if (!used[j]) {
        cout << "No";
        return 0;
      }
    }
    cur += c[i];
  }
  cout << "Yes" << endl;
  for (int i = 0; i < (k); i++) deyk(i, k);
}
