output_description: If there is no assignment satisfying the conditions, print a single line
  containing `-1`.
  
  If such an assignment exists, print one such assignment in the following
  format:
  
      
      
      S
      C_1
      C_2
      \vdots
      C_M
      
  
  Here,
  
    * the first line should contain the string S of length N. Its i-th character (1 \leq i \leq N) should be `W` if Vertex i is assigned white and `B` if it is assigned black.
    * The (i + 1)-th line (1 \leq i \leq M) should contain the integer weight C_i assigned to Edge i.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N M
      D_1 D_2 ... D_N
      U_1 V_1
      U_2 V_2
      \vdots
      U_M V_M
attempt: import sys
  from bisect import bisect_left
  
  N, M = map(int, input().split())
  D = [0] + list(map(int, input().split()))
  UV = []
  
  que = []
  
  S = [-1] * (N + 1)
  C = [0] * M
  edge = [[] for i in range(N + 1)]
  
  for i in range(M):
      U, V = map(int, input().split())
      if U > V:
          U, V = V, U
      UV.append([U, V, i])
      edge[U].append(V)
      edge[V].append(U)
  
      if D[U] == D[V]:
  
          que.append(U)
          que.append(V)
          C[i] = D[U]
          S[U] = 1
          S[V] = 0
  
  UV.sort()
  data = []
  for i in range(1, N + 1):
      data.append([D[i], i])
  data.sort()
  if data[0][0] != data[1][0]:
      print(-1)
      sys.exit()
  
  
  def f(a, b):
      nnn = D[b] - D[a]
      if a > b:
          a, b = b, a
      b = bisect_left(UV, [a, b])
      C[UV[b][2]] = nnn
  
  
  while que:
      h = []
      for u in que:
          for v in edge[u]:
              if S[v] == -1 and D[v] > D[u]:
                  f(u, v)
                  S[v] = S[u]
                  h.append(v)
      que = h
  for i in range(M):
      if C[i] == 0:
          C[i] = 10**9
  for i in range(1, N + 1):
      if S[i] == 1:
          S[i] = "B"
      elif S[i] == 0:
          S[i] = "W"
      else:
          print(-1)
          sys.exit()
  print("".join(S[1:]))
  for u in C:
      print(u)
  
problem_description: Statement
  
  We have a connected undirected graph with N vertices and M edges. Edge i in
  this graph (1 \leq i \leq M) connects Vertex U_i and Vertex V_i
  bidirectionally. We are additionally given N integers D_1, D_2, ..., D_N.
  
  Determine whether the conditions below can be satisfied by assigning a color -
  white or black - to each vertex and an integer weight between 1 and 10^9
  (inclusive) to each edge in this graph. If the answer is yes, find one such
  assignment of colors and integers, too.
  
    * There is at least one vertex assigned white and at least one vertex assigned black.
    * For each vertex v (1 \leq v \leq N), the following holds.
      * The minimum cost to travel from Vertex v to a vertex whose color assigned is different from that of Vertex v by traversing the edges is equal to D_v.
  
  Here, the cost of traversing the edges is the sum of the weights of the edges
  traversed.
samples: [{"input": "5 5\n    3 4 3 5 7\n    1 2\n    1 3\n    3 2\n    4 2\n    4 5", "output": "BWWBB\n    4\n    3\n    1\n    5\n    2\n    \n\nAssume that we assign the colors and integers as the sample output, and let us\nconsider Vertex 5, for example. To travel from Vertex 5, which is assigned\nblack, to a vertex that is assigned white with the minimum cost, we should\nmake these moves: Vertex 5 \\to Vertex 4 \\to Vertex 2. The total cost of these\nmoves is 7, which satisfies the condition. We can also verify that the\ncondition is satisfied for other vertices.\n\n* * *"}, {"input": "5 7\n    1 2 3 4 5\n    1 2\n    1 3\n    1 4\n    2 3\n    2 5\n    3 5\n    4 5", "output": "-1\n    \n\n* * *"}, {"input": "4 6\n    1 1 1 1\n    1 2\n    1 3\n    1 4\n    2 3\n    2 4\n    3 4", "output": "BBBW\n    1\n    1\n    1\n    2\n    1\n    1"}]