#include <bits/stdc++.h>
const int maxn = 100010, maxm = 100010;
int n, m, a[maxm], b[maxm];
struct edge {
  int id, to;
  edge* next;
} E[maxm * 2], *ne = E, *first[maxn];
void link(int i, int u, int v) {
  *ne = (edge){i, v, first[u]};
  first[u] = ne++;
}
bool vis[maxn], par[maxn];
long long c[maxn], ev[maxm];
long long dfs(int i) {
  vis[i] = 1;
  long long r = c[i];
  for (edge* e = first[i]; e; e = e->next) {
    if (!vis[e->to]) {
      par[e->to] = !par[i];
      ev[e->id] = dfs(e->to);
      r -= ev[e->id];
    }
  }
  return r;
}
void op(int a) {
  if (a) {
    puts("YES");
    for (int i = 0; i < m; i++) printf("%lld\n", ev[i]);
  } else
    puts("NO");
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%lld", c + i);
  for (int i = 0; i < m; i++)
    scanf("%d%d", a + i, b + i), link(i, a[i], b[i]), link(i, b[i], a[i]);
  long long v1 = dfs(1);
  if (!v1)
    op(1);
  else {
    int e = 0;
    while (e < m && par[a[e]] != par[b[e]]) e++;
    if (e == m)
      op(0);
    else {
      for (int i = 1; i <= n; i++) vis[i] = 0;
      if (par[a[e]])
        ev[e] = -v1 / 2;
      else
        ev[e] = v1 / 2;
      c[a[e]] -= ev[e];
      c[b[e]] -= ev[e];
      dfs(1);
      op(1);
    }
  }
}
