#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
template <class T1, class T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << "{" << p.first << "," << p.second << "}";
  return os;
}
const int N = 3e5 + 5;
const int oo = 1e9 + 7;
vector<pair<int, long long> > g[N];
int tin[N];
int low[N];
int dfs_timer;
int total_tree_node;
vector<int> nodes[N];
int to_node[N];
vector<pair<int, long long> > tree[N];
void add_bridge_edge(int u, int v, long long w) {
  tree[u].emplace_back(v, w);
  tree[v].emplace_back(u, w);
}
void dfs1(int u, int p = -1) {
  low[u] = tin[u] = dfs_timer++;
  for (pair<int, long long> vw : g[u]) {
    int v = vw.first;
    long long w = vw.second;
    if (v == p) continue;
    if (tin[v] == -1) {
      dfs1(v, u);
    }
    low[u] = min(low[u], low[v]);
  }
}
void dfs2(int u, int p = -1) {
  if (low[u] == tin[u]) {
    to_node[u] = ++total_tree_node;
  } else
    to_node[u] = to_node[p];
  for (pair<int, long long> vw : g[u]) {
    int v = vw.first;
    long long w = vw.second;
    if (v == p) continue;
    if (to_node[v] == -1) dfs2(v, u);
    if (low[v] > tin[u]) {
      add_bridge_edge(to_node[u], to_node[v], w);
    }
  }
  nodes[to_node[u]].push_back(u);
}
void block_cut_tree() {
  dfs_timer = 1;
  total_tree_node = 0;
  memset(tin, -1, sizeof tin);
  memset(to_node, -1, sizeof to_node);
  dfs1(1);
  dfs2(1);
}
int special[N];
int special_[N];
long long c[N];
long long w[N];
long long dp[N];
long long c_sum[N];
long long ans[N];
int up_special[N];
int k;
long long up_dp[N];
long long f(int v, long long w) {
  if (special[v] == k or special[v] == 0)
    return dp[v];
  else
    return max(0LL, dp[v] - w);
}
void dfs3(int u, int p = -1) {
  dp[u] = c_sum[u];
  for (pair<int, long long> vw : tree[u]) {
    int v = vw.first;
    long long w = vw.second;
    if (v == p) continue;
    dfs3(v, u);
    if (special[v] == k or special[v] == 0) {
      dp[u] += dp[v];
    } else {
      dp[u] += max(0LL, dp[v] - w);
    }
    special[u] += special[v];
  }
}
void dfs4(int u, int p = -1) {
  up_special[u] += special[u];
  for (pair<int, long long> vw : tree[u]) {
    int v = vw.first;
    long long w = vw.second;
    if (v == p) continue;
    long long now = up_dp[u] + dp[u] - f(v, w);
    up_special[v] = up_special[u] - special[v];
    if (up_special[v] == k or up_special[v] == 0)
      up_dp[v] += now;
    else
      up_dp[v] += max(0LL, now - w);
    dfs4(v, u);
  }
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++) {
    int v;
    cin >> v;
    special_[v]++;
  }
  for (int i = 1; i <= n; i++) cin >> c[i];
  for (int i = 1; i <= m; i++) cin >> w[i];
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back({v, w[i]});
    g[v].push_back({u, w[i]});
  }
  block_cut_tree();
  for (int i = 1; i <= n; i++)
    c_sum[to_node[i]] += c[i], special[to_node[i]] += special_[i];
  dfs3(1);
  dfs4(1);
  for (int i = 1; i <= n; i++) ans[i] = dp[i] + up_dp[i];
  for (int i = 1; i <= n; i++) cout << ans[to_node[i]] << " ";
}
