#include <bits/stdc++.h>
using namespace std;
const int maxn = 100011;
int pre[maxn << 1], son[maxn << 1], v[maxn << 1], now[maxn], tot;
void add(int a, int b, int c) {
  pre[++tot] = now[a];
  now[a] = tot;
  son[tot] = b;
  v[tot] = c;
}
void cc(int a, int b, int c) {
  add(a, b, c);
  add(b, a, c);
}
struct Te {
  int a, b;
  long long ans;
} e[maxn];
int n, m;
long long a[maxn];
void init() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%lld", a + i);
  for (int i = 1; i <= m; ++i) scanf("%d%d", &e[i].a, &e[i].b), e[i].ans = 0;
}
int fa[maxn], dep[maxn];
long long V[maxn];
inline int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void dfs(int x, int fa) {
  for (int p = now[x]; p; p = pre[p])
    if (son[p] != fa)
      V[son[p]] = a[son[p]], dep[son[p]] = dep[x] + 1, dfs(son[p], x),
      V[x] -= V[son[p]];
}
void work() {
  for (int i = 1; i <= n; ++i) fa[i] = i;
  for (int i = 1; i <= m; ++i) {
    if (find(e[i].a) != find(e[i].b)) {
      cc(e[i].a, e[i].b, i);
      fa[find(e[i].a)] = find(e[i].b);
    }
  }
  V[1] = a[1];
  dep[1] = 1;
  dfs(1, 0);
  if (V[1] & 1) return puts("NO"), void();
  bool ok = !V[1];
  if (!ok)
    for (int i = 1; i <= m; ++i)
      if ((dep[e[i].a] + dep[e[i].b]) % 2 == 0) {
        e[i].ans = ((dep[e[i].a] & 1) ? 1 : -1) * V[1] / 2;
        ok = 1;
        a[e[i].a] -= e[i].ans;
        a[e[i].b] -= e[i].ans;
        break;
      }
  if (!ok) return puts("NO"), void();
  V[1] = a[1];
  dfs(1, 0);
  for (int i = 1; i <= n; ++i)
    for (int p = now[i]; p; p = pre[p])
      if (dep[son[p]] > dep[i]) e[v[p]].ans = V[son[p]];
  puts("YES");
  for (int i = 1; i <= m; ++i) printf("%lld\n", e[i].ans);
}
int main() {
  init();
  work();
  return 0;
}
