#include // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include using namespace std; using namespace atcoder; using ll=long long; using LL=__int128; using ld=long double; using uint=unsigned int; using ull=unsigned long long; using pii=pair; using pll=pair; template using vc=vector; template using vvc=vector>; template using vvvc=vector>; using vi=vc; using vvi=vvc; using vd=vc; using vvd=vvc; using vl=vc; using vvl=vvc; using vs=vc; using vp=vc; using vvp=vvc; #define overload3(_1,_2,_3,name,...) name #define rep1(n) for(ll _=0;_ll(a);) #define rrep(...) overload3(__VA_ARGS__,rrep3,rrep2,rrep1)(__VA_ARGS__) #define ALL(a) (a).begin(),(a).end() #define RALL(a) (a).rbegin(),(a).rend() template ostream& operator<<(ostream& os,static_modint v){ os<>(istream& is,__int128& v){ string s; is>>s; v=0; rep(i,s.size())if(isdigit(s[i])) v=v*10+s[i]-'0'; if(s[0]=='-') v*=-1; return is; } ostream& operator<<(ostream& os,__int128 v){ ostream::sentry s(os); if(s){ __uint128_t t=v<0?-v:v; char buf[128]; char* d=end(buf); do{ d--; *d="0123456789"[t%10]; t/=10; }while(t); if(v<0){ d--; *d='-'; } int len=end(buf)-d; if(os.rdbuf()->sputn(d,len)!=len) os.setstate(ios_base::badbit); } return os; } template ostream& operator<<(ostream& os,pair a){ os< ostream& operator<<(ostream& os,vector a){ if(a.empty()) return os; os< ostream& operator<<(ostream& os,vector> a){ if(a.empty()) return os; os< void output(vector a,bool next_line=0){ if(next_line){ for(auto x:a) output(x); } else cout<y) x=y;} void chmax(auto &x,auto y){if(x void read(vector &a,int n,int off=0){ a=vector(n); for(auto &i:a){ cin>>i; i-=off; } } void read(vs &a,int n){ a=vs(n); for(auto &i:a) cin>>i; } template void read(vector> &a,int n,int off=0){ a=vector>(n); for(auto &[x,y]:a){ cin>>x>>y; x-=off,y-=off; } } template void read(vector> &a,int n,int m,int off=0){ a=vector>(n,vector(m)); for(auto &i:a) for(auto &j:i){ cin>>j; j-=off; } } template void readGraph(vector> &g,int n,int m,bool rv=1,int off=1){ g=vector>(n); for(int i=0;i>u>>v; u-=off,v-=off; g[u].emplace_back(v); if(rv) g[v].emplace_back(u); } } template void readGraph(vector>> &g,int n,int m,bool id=0,bool rv=1,int off=1){ g=vector>>(n); for(int i=0;i>u>>v; u-=off,v-=off; g[u].emplace_back(v,i); if(rv) g[v].emplace_back(u,i); } else{ T u,v,w; cin>>u>>v>>w; u-=off,v-=off; g[u].emplace_back(v,w); if(rv) g[v].emplace_back(u,w); } } } string toBinary(ll x,ll n,bool rev=0){ assert(0<=x&&x<1LL<; using vm=vc; using vvm=vvc; void main2(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ll q=1; // cin>>q; while(q--) main2(); } void main2(){ ll n,m; cin>>n>>m; vm a(n); rep(i,n){ ll x; cin>>x; a[i]=x; } const vm a_=a; vp ed; read(ed,m,1); dsu uft(2*n); for(auto [u,v]:ed){ uft.merge(u,v+n); uft.merge(u+n,v); } vm rs(m); if(uft.same(0,n)){ dsu uft2(n); dsu uft3(2*n); vvp g(n); vl deg(n); bool flag=true; rep(i,m){ auto [u,v]=ed[i]; if(!uft2.same(u,v)){ uft2.merge(u,v); uft3.merge(u,v+n); uft3.merge(u+n,v); g[u].emplace_back(v,i); g[v].emplace_back(u,i); deg[u]++,deg[v]++; } else if(flag&&uft3.same(u,v)){ flag=false; uft2.merge(u,v); g[u].emplace_back(v,i); g[v].emplace_back(u,i); deg[u]++,deg[v]++; } } queue q; rep(i,n)if(deg[i]==1) q.emplace(i); while(!q.empty()){ ll v=q.front();q.pop(); for(auto [u,i]:g[v])if(deg[u]){ deg[u]--,deg[v]--; if(deg[u]==1) q.emplace(u); rs[i]=a[v]; a[u]-=rs[i]; } } vl vs; rep(i,n)if(deg[i]==2){ ll v=i,pre=v; do{ vs.emplace_back(v); for(auto [u,_]:g[v])if(deg[u]&&u!=pre){ pre=v,v=u; break; } }while(v!=i); break; } mint tp=0; ll sz=vs.size(); rep(i,sz){ ll v=vs[i]; tp+=a[v]*(i==0||i%2==1?1:-1); } rep(i,sz){ ll v=vs[i],nv=vs[(i+1)%sz]; for(auto [u,id]:g[v])if(u==nv){ rs[id]=tp/2; } tp=-tp+2*a[nv]; } } else{ mint sm=0; rep(i,n) sm+=(uft.same(i,0)?a[i]:-a[i]); if(sm==0){ dsu uft2(n); vvp g(n); vl deg(n); rep(i,m){ auto [u,v]=ed[i]; if(!uft2.same(u,v)){ uft2.merge(u,v); g[u].emplace_back(v,i); g[v].emplace_back(u,i); deg[u]++,deg[v]++; } } queue q; rep(i,n)if(deg[i]==1) q.emplace(i); rep(n-1){ assert(!q.empty()); ll v=q.front();q.pop(); for(auto [u,i]:g[v])if(deg[u]){ deg[u]--,deg[v]--; if(deg[u]==1) q.emplace(u); rs[i]=a[v]; a[u]-=rs[i]; } } } else{ rs.clear(); } } if(rs.empty()) output(-1); else{ output(rs); vm b(n); rep(i,m){ auto [u,v]=ed[i]; b[u]+=rs[i]; b[v]+=rs[i]; } assert(a_==b); } }