#include<iostream> #include<vector> #include<queue> #include<algorithm> #include<cassert> #include<atcoder/modint> using namespace std; using mint=atcoder::modint998244353; int N,M; int A[250]; int W[250]; int dist[250]; vector<int>P; vector<int>G[250]; mint ans[250]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>N>>M; for(int i=0;i<N;i++) { ans[i]=1; cin>>A[i]; int a=A[i]; for(int p=2;p*p<=a;p++)if(a%p==0) { while(a%p==0)a/=p; P.push_back(p); } if(a>1)P.push_back(a); } sort(P.begin(),P.end()); P.erase(unique(P.begin(),P.end()),P.end()); for(int i=0;i<M;i++) { int u,v;cin>>u>>v; u--,v--; G[u].push_back(v); G[v].push_back(u); } for(int p:P) { for(int i=0;i<N;i++) { W[i]=0; while(A[i]%p==0)A[i]/=p,W[i]++; dist[i]=1e9; } dist[0]=W[0]; priority_queue<pair<int,int> >Q; Q.push(make_pair(-dist[0],0)); while(!Q.empty()) { int u=Q.top().second; int d=-Q.top().first; Q.pop(); if(dist[u]<d)continue; for(int v:G[u]) { int nd=max(d,W[v]); if(dist[v]>nd) { dist[v]=nd; Q.push(make_pair(-dist[v],v)); } } } //cout<<"p = "<<p<<endl; for(int i=0;i<N;i++) { ans[i]*=mint::raw(p).pow(dist[i]); //cout<<i<<"="<<dist[i]<<", "; } //cout<<endl; } for(int i=0;i<N;i++)cout<<ans[i].val()<<"\n"; }