class unif: def __init__(self,n): self.pare=[-1]*n self.size=[1]*n def root(self,x): while self.pare[x]!=-1: x=self.pare[x] return x def unite(self,u,v): rootu=self.root(u) rootv=self.root(v) if rootu!=rootv: if self.size[rootu]>=self.size[rootv]: self.pare[rootv]=rootu self.size[rootu]+=self.size[rootv] else: self.pare[rootu]=rootv self.size[rootv]+=self.size[rootu] def same(self,s,t): return self.root(s)==self.root(t) N,M=map(int,input().split()) T=[] B=list(map(int,input().split())) G=[[] for i in range(N)] L=[] Z=unif(N) for i in range(M): a,b=map(int,input().split()) a-=1 b-=1 if Z.same(a,b)==False: G[a].append((b,i)) G[b].append((a,i)) Z.unite(a,b) L.append((a,b)) result=[0]*M from collections import deque S=deque() dist=[-1]*N dist[0]=0 S.append(0) while S: x=S.popleft() for E in G[x]: y=E[0] if dist[y]>=0: continue dist[y]=dist[x]+1 S.append(y) mod=998244353 z=0 for i in range(1,N): if dist[i]%2==1: z+=B[i] else: z-=B[i] c=z-B[0] dp=[0]*N z=c for i in range(M): a,b=L[i][:] if dist[a]%2==dist[b]%2: if dist[a]%2==1: k=z*pow(2,-1,mod) k%=mod result[i]=k dp[a]+=k dp[b]+=k break else: k=(-z)*pow(2,-1,mod) k%=mod result[i]=k dp[a]+=k dp[b]+=k break P=[] for i in range(N): P.append((dist[i],i)) P.sort(reverse=True) for i in range(N): pos=P[i][1] for E in G[pos]: y,t=E[:] if dist[y]