#include <bits/stdc++.h>
using namespace std;
int head[100010], nxt[100010 * 2], to[100010 * 2], fa[100010], fr[100010];
int dep[100010];
long long ans[100010], w[100010];
int n, m, num, e;
long long sum[2];
void addedge(int x, int y) {
  num++;
  to[num] = y;
  nxt[num] = head[x];
  head[x] = num;
}
void dfs(int x) {
  sum[dep[x] & 1] += w[x];
  for (int p = head[x]; p; p = nxt[p])
    if (to[p] != fa[x]) {
      if (!dep[to[p]])
        dep[to[p]] = dep[x] + 1, fa[to[p]] = x, fr[to[p]] = p, dfs(to[p]);
      else if ((dep[x] - dep[to[p]] + 1) & 1)
        e = p;
    }
}
void solve(int x) {
  for (int p = head[x]; p; p = nxt[p])
    if (fa[to[p]] == x) solve(to[p]), w[x] -= ans[p / 2];
  ans[fr[x] / 2] = w[x];
  w[x] -= ans[fr[x] / 2];
}
int main() {
  num = 1;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%I64d", &w[i]);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    addedge(x, y);
    addedge(y, x);
  }
  dep[1] = 1;
  dfs(1);
  if ((sum[1] - sum[0]) & 1) {
    puts("NO");
    return 0;
  }
  if (!e && sum[1] != sum[0]) {
    puts("NO");
    return 0;
  }
  if (e && sum[1] != sum[0]) {
    if (dep[to[e]] & 1)
      ans[e / 2] = (sum[1] - sum[0]) / 2, sum[1] = sum[0];
    else
      ans[e / 2] = (sum[0] - sum[1]) / 2, sum[0] = sum[1];
    w[to[e]] -= ans[e / 2];
    w[to[e ^ 1]] -= ans[e / 2];
  }
  solve(1);
  puts("YES");
  for (int i = 1; i <= m; i++) printf("%I64d\n", ans[i]);
  return 0;
}
