2 1
1 1
2 1
 8 12
-6 2 -3 2 6 -7 1 -5
2 1
5 6
1 6
1 4
8 2
2 7
2 5
8 3
8 4
3 7
7 6
3 1
 10 13
3 4 -3 8 6 4 -5 1 3 -7
9 5
9 2
10 3
1 4
3 5
9 1
6 10
10 4
3 1
2 7
1 6
1 7
7 8
 43 52
-23 -18 -35 21 -12 38 -35 -11 28 -20 27 -5 9 -19 -39 -25 -32 32 -36 28 11 37 1 -25 -22 9 -15 21 25 -39 10 36 -30 -40 22 26 25 -27 -22 -38 -1 18 -13
33 40
31 23
30 26
21 17
6 2
41 19
32 39
32 23
13 14
25 35
31 30
19 32
25 22
34 36
7 40
23 6
40 12
1 3
23 43
36 13
18 33
17 32
7 3
21 34
41 35
20 7
23 1
41 8
25 19
20 29
42 5
40 21
9 37
17 41
30 10
41 18
39 1
20 24
20 4
42 3
20 25
5 16
31 9
42 28
10 11
19 42
31 38
25 2
31 27
17 25
13 15
31 20
 2 1
1 1
1 2
 5 7
4 1 5 3 -1
2 4
5 4
5 2
1 5
1 2
4 1
1 3
 10 12
5 1 1 8 -8 10 -3 -2 1 7
5 3
8 2
10 9
4 6
5 6
4 5
5 10
4 7
8 4
3 1
3 6
6 10
 20 40
-9 -10 -9 15 -3 -5 -17 -10 -6 2 -13 19 10 -15 15 -14 17 0 7 -8
3 17
6 18
15 12
2 5
18 3
16 20
6 17
20 10
10 18
9 12
15 3
6 4
15 16
20 6
20 9
9 4
4 8
14 5
11 7
12 11
3 13
14 19
7 17
16 14
19 7
12 13
14 13
13 11
9 14
13 17
8 19
5 20
2 17
2 16
12 5
8 1
20 3
6 2
5 18
13 8

YES
                                                               1
 NO
 YES
                                                              -7
                                                              10
                                                             -16
                                                               3
                                                              13
                                                               0
                                                               4
                                                               5
                                                               0
                                                              -6
                                                               0
                                                               0
                                                               1
 NO
 YES
                                                               1
 YES
                                                               2
                                                               1
                                                              -1
                                                              -1
                                                               0
                                                               0
                                                               5
 YES
-4
1
1
17
-7
-3
6
-3
-3
5
0
0
 YES
                                                             -30
                                                             -21
                                                             -23
                                                             -10
                                                              21
                                                             -52
                                                               0
                                                               2
                                                               0
                                                              -9
                                                               0
                                                              16
                                                              38
                                                               0
                                                              42
                                                               0
                                                              -1
                                                               7
                                                             -64
                                                              51
                                                               0
                                                               7
                                                              47
                                                               0
                                                               0
                                                               0
                                                              10
                                                               0
                                                             -39
                                                               0
                                                               0
                                                               0
                                                               0
                                                               0
                                                               0
                                                              -9
                                                               0
                                                               0
                                                               0
                                                               0

#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int MOD = 1000000007;
const int UNDEF = -1;
const int INF = 1 << 30;
template <typename T>
inline bool chkmax(T &aa, T bb) {
  return aa < bb ? aa = bb, true : false;
}
template <typename T>
inline bool chkmin(T &aa, T bb) {
  return aa > bb ? aa = bb, true : false;
}
int rint();
char rch();
long long rlong();
const int mn = 1e5 + 2;
vector<pair<int, int> > g[mn];
int inp[mn];
char vcol[mn];
int n;
int sodd = -1;
void findodd(int x, int p, int col) {
  if (vcol[x] != -1) {
    if (vcol[x] == col)
      return;
    else {
      sodd = x;
      return;
    }
  }
  vcol[x] = col;
  for (auto &yy : g[x]) {
    int y = yy.first;
    if (y == p) continue;
    findodd(y, x, col ^ 1);
  }
}
vector<int> voddcyc;
bool getoddcyc(int x, int p, int col) {
  if (vcol[x] != -1) {
    if (vcol[x] == col)
      return false;
    else {
      return true;
    }
  }
  vcol[x] = col;
  for (auto &yy : g[x]) {
    int y = yy.first;
    if (y == p) continue;
    bool res = getoddcyc(y, x, col ^ 1);
    if (res) {
      voddcyc.push_back(yy.second);
      return true;
    }
  }
  return false;
}
int vans[mn];
bitset<mn> seen;
int dfs(int x, int p) {
  seen[x] = true;
  int sum = 0;
  for (auto &ye : g[x]) {
    int y = ye.first, e = ye.second;
    if (y == p || seen[y]) continue;
    int got = dfs(y, x);
    vans[e] += got;
    printf("dfs e:%d got:%d\n", e, got);
    sum += got;
  }
  int need = inp[x] - sum;
  return need;
}
void fail(int t) {
  printf("NO\n");
  exit(0);
}
bool check(int x) {
  int sum = 0;
  for (auto &ye : g[x]) {
    int e = ye.second;
    sum += vans[e];
  }
  return sum == inp[x];
}
void checkall() {
  for (int x = 1; x <= n; x++) check(x);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  n = rint();
  int m = rint();
  for (int x = 1; x <= n; x++) inp[x] = rint();
  for (int e = 1; e <= m; e++) {
    int x = rint(), y = rint();
    g[x].push_back(make_pair(y, e));
    g[y].push_back(make_pair(x, e));
  }
  memset(vcol, -1, sizeof vcol);
  findodd(1, -1, 0);
  if (sodd != -1) {
    memset(vcol, -1, sizeof vcol);
    bool res = getoddcyc(sodd, -1, 0);
    voddcyc.size() & 1;
    res;
    printf("sodd:%d\n", sodd);
    int extra = dfs(sodd, -1);
    if (extra & 1) fail(2);
    int offset = extra / 2;
    for (auto &e : voddcyc) {
      vans[e] += offset;
      printf("cyc e:%d offset:%d\n", e, offset);
      offset *= -1;
    }
  } else {
    int got = dfs(1, -1);
    if (got != 0) fail(1);
  }
  printf("YES\n");
  for (int e = 1; e <= m; e++) printf("%d\n", vans[e]);
  fflush(stdout);
  checkall();
}
static char stdinBuffer[1024];
static char *stdinDataEnd = stdinBuffer + sizeof(stdinBuffer);
static const char *stdinPos = stdinDataEnd;
void readAhead(size_t amount) {
  size_t remaining = stdinDataEnd - stdinPos;
  if (remaining < amount) {
    memmove(stdinBuffer, stdinPos, remaining);
    size_t sz = fread(stdinBuffer + remaining, 1,
                      sizeof(stdinBuffer) - remaining, stdin);
    stdinPos = stdinBuffer;
    stdinDataEnd = stdinBuffer + remaining + sz;
    if (stdinDataEnd != stdinBuffer + sizeof(stdinBuffer)) *stdinDataEnd = 0;
  }
}
int rint() {
  readAhead(16);
  int x = 0;
  bool neg = false;
  while (*stdinPos == ' ' || *stdinPos == '\n') ++stdinPos;
  if (*stdinPos == '-') {
    ++stdinPos;
    neg = true;
  }
  while (*stdinPos >= '0' && *stdinPos <= '9') {
    x *= 10;
    x += *stdinPos - '0';
    ++stdinPos;
  }
  return neg ? -x : x;
}
char rch() {
  readAhead(16);
  while (*stdinPos == ' ' || *stdinPos == '\n') ++stdinPos;
  char ans = *stdinPos;
  ++stdinPos;
  return ans;
}
long long rlong() {
  readAhead(32);
  long long x = 0;
  bool neg = false;
  while (*stdinPos == ' ' || *stdinPos == '\n') ++stdinPos;
  if (*stdinPos == '-') {
    ++stdinPos;
    neg = true;
  }
  while (*stdinPos >= '0' && *stdinPos <= '9') {
    x *= 10;
    x += *stdinPos - '0';
    ++stdinPos;
  }
  return neg ? -x : x;
}
