#include <bits/stdc++.h>
using namespace std;
const int N = 110000;
long long ans[N];
int dp[N], a[N], b[N], vis[N], par[N];
long long c[N], sum[2];
vector<int> adj[N];
void dfs(int u, int d) {
  dp[u] = d, vis[u] = 1;
  for (int e : adj[u]) {
    int v = a[e] + b[e] - u;
    if (vis[v]) continue;
    par[v] = u;
    dfs(v, d + 1);
  }
}
void solve(int u) {
  for (int e : adj[u]) {
    int v = a[e] + b[e] - u;
    if (par[v] == u) {
      solve(v);
      ans[e] = c[v];
      c[u] -= ans[e];
    }
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%lld", &c[i]);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    adj[u].push_back(i);
    adj[v].push_back(i);
    a[i] = u, b[i] = v;
  }
  dfs(1, 0);
  for (int i = 1; i <= n; i++) sum[dp[i] & 1] += c[i];
  if (sum[0] != sum[1]) {
    int flg = 0;
    for (int i = 1; i <= m; i++) {
      int u = a[i], v = b[i];
      if (dp[u] + dp[v] + 1 & 1) {
        flg = 1;
        ans[i] = (sum[dp[u] & 1] - sum[dp[u] + 1 & 1]) / 2;
        c[u] -= ans[i], c[v] -= ans[i];
        break;
      }
    }
    if (!flg) return puts("NO"), 0;
  }
  solve(1);
  puts("YES");
  for (int i = 1; i <= m; i++) printf("%lld\n", ans[i]);
  return 0;
}
