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: """
  明らかに無理→最小が2つ無い or 最小同士がペアになってない
  (最小から接続する頂点に最小がない)
  
  満たしてる→最小の辺を置いちゃおう
  小さい奴からGreedyに置いてく？
  
  自分の周りにendしてるやつ or 大きさが同じやつがあったら繋げちゃう
  そのとき白黒はどうでも良さそう？
  
  """
  
  import sys
  
  N, M = map(int, input().split())
  
  D = list(map(int, input().split()))
  
  dic2 = [[] for i in range(N)]
  
  for i in range(M):
  
      U, V = map(int, input().split())
      U -= 1
      V -= 1
  
      if len(dic2[U]) == 0 or dic2[U][0][0] > D[V]:
          dic2[U] = []
          dic2[U].append([D[V], V, i])
      if len(dic2[V]) == 0 or dic2[V][0][0] > D[U]:
          dic2[V] = []
          dic2[V].append([D[U], U, i])
  
  
  dic = [[] for i in range(N)]
  for i in range(N):
      for j in dic2[i]:
          dic[i].append([j[1], j[2]])
  
  # print (dic)
  
  end = [False] * N
  color = [0] * N
  q = []
  ans = [10**9] * M
  
  for i in range(N):
      q.append([D[i], i])
  q.sort()
  # print (q)
  
  for i in range(N):
      if end[q[i][1]]:
          continue
      flag = False
      for vi in dic[q[i][1]]:
          nexv = vi[0]
          mind = vi[1]
          nowd = q[i][0]
          nowp = q[i][1]
          # print (vi,q[i])
  
          if end[nexv]:
              flag = True
              color[nowp] = color[nexv] ^ 1
              end[nowp] = True
              ans[mind] = nowd
              break
          elif D[nexv] == nowd:
  
              flag = True
              color[nowp] = color[nexv] ^ 1
              end[nowp] = True
              end[nexv] = True
              ans[mind] = nowd
              break
          break
      # print (ans)
  
      if not flag:
          print(-1)
          sys.exit()
  
  
  S = []
  for i in color:
      if i == 0:
          S.append("B")
      else:
          S.append("W")
  
  print(" ".join(S))
  
  print(" ".join(map(str, ans)))
  
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"}]