#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const long long maxn = 1e6 + 100;
const long long inf = 1e15;
long long n, m, k, t;
struct edge {
  long long to;
  long long w;
  long long v;
};
vector<edge> V[maxn];
vector<edge> V1[maxn];
long long H[maxn];
long long D[maxn];
set<edge> bridges;
bool operator<(edge a, edge b) {
  if (a.v == b.v) {
    return a.to < b.to;
  }
  return a.v < b.v;
}
bool is_bridge(edge e) {
  if (e.v > e.to) {
    swap(e.v, e.to);
  }
  if (bridges.find(e) == bridges.end()) {
    return 0;
  }
  return 1;
}
bool used[maxn];
bool F[maxn];
bool F1[maxn];
bool F2[maxn];
long long X[maxn];
long long X1[maxn];
void dfs(long long v, long long p) {
  if (v != p) {
    H[v] = H[p] + 1;
  }
  D[v] = H[v];
  used[v] = 1;
  for (auto p1 : V[v]) {
    long long v1 = p1.to;
    if (v1 == p) {
      continue;
    }
    if (!used[v1]) {
      dfs(v1, v);
      D[v] = min(D[v], D[v1]);
    } else {
      D[v] = min(D[v], H[v1]);
    }
    if (D[v1] > H[v]) {
      if (p1.v > p1.to) {
        swap(p1.v, p1.to);
      }
      bridges.insert(p1);
    }
  }
}
long long color = 1;
long long C[maxn];
long long W[maxn];
long long ANS[maxn];
void dfs1(long long v) {
  C[v] = color;
  for (auto p1 : V[v]) {
    long long v1 = p1.to;
    if (C[v1] != 0) {
      continue;
    }
    if (is_bridge(p1)) {
      continue;
    }
    dfs1(v1);
  }
}
vector<long long> DD[maxn];
void dfs2(long long v, long long p, long long f) {
  DD[v].resize(V1[v].size());
  D[v] = X1[v];
  long long sf = f + F2[v];
  for (long long q = 0; q < V1[v].size(); q++) {
    auto p1 = V1[v][q];
    long long v1 = p1.to;
    if (v1 == p) {
      continue;
    }
    sf += F1[v1];
  }
  for (long long q = 0; q < V1[v].size(); q++) {
    auto p1 = V1[v][q];
    long long v1 = p1.to;
    if (v1 == p) {
      continue;
    }
    long long nf = sf - F1[v1];
    dfs2(v1, v, nf);
    long long dd;
    if (F1[v1] && nf != 0) {
      dd = max(0LL, D[v1] - p1.w);
    } else {
      dd = D[v1];
    }
    DD[v][q] = dd;
    D[v] += dd;
  }
}
void dfs3(long long v, long long p, long long f, long long d, long long w) {
  ANS[v] = D[v];
  long long sf = f + F2[v];
  for (long long q = 0; q < V1[v].size(); q++) {
    auto p1 = V1[v][q];
    long long v1 = p1.to;
    if (v1 == p) {
      continue;
    }
    sf += F1[v1];
  }
  if (f != 0 && f != sf) {
    ANS[v] += max(0LL, d - w);
  } else {
    ANS[v] += d;
  }
  for (long long q = 0; q < V1[v].size(); q++) {
    auto p1 = V1[v][q];
    long long v1 = p1.to;
    if (v1 == p) {
      continue;
    }
    long long d1 = ANS[v] - DD[v][q];
    dfs3(v1, v, sf - F1[v1], d1, p1.w);
  }
}
void dfs4(long long v, long long p) {
  for (auto p1 : V1[v]) {
    long long v1 = p1.to;
    if (v1 == p) {
      continue;
    }
    dfs4(v1, v);
    F1[v] |= F1[v1];
  }
}
int main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cout << setprecision(10) << fixed;
  long long q, w, e, a, b, c;
  cin >> n >> m >> k;
  for (q = 0; q < k; q++) {
    cin >> a;
    a--;
    F[a] = 1;
  }
  for (q = 0; q < n; q++) {
    cin >> X[q];
  }
  for (q = 0; q < m; q++) {
    cin >> W[q];
  }
  for (q = 0; q < m; q++) {
    cin >> a >> b;
    a--;
    b--;
    edge e, f;
    e.v = f.to = a;
    f.v = e.to = b;
    e.w = f.w = W[q];
    V[a].push_back(e);
    V[b].push_back(f);
  }
  dfs(0, 0);
  for (q = 0; q < n; q++) {
    if (C[q] == 0) {
      dfs1(q);
      color++;
    }
  }
  for (q = 0; q < n; q++) {
    X1[C[q]] += X[q];
    F1[C[q]] |= F[q];
    F2[C[q]] = F1[C[q]];
  }
  for (auto p : bridges) {
    long long v1 = C[p.v], v2 = C[p.to];
    edge e, f;
    e.v = f.to = v1;
    f.v = e.to = v2;
    e.w = f.w = p.w;
    V1[v1].push_back(e);
    V1[v2].push_back(f);
  }
  dfs4(1, 1);
  dfs2(1, 1, 0);
  dfs3(1, 1, 0, 0, 0);
  for (q = 0; q < n; q++) {
    cout << ANS[C[q]] << " ";
  }
  return 0;
}
