#include using namespace std; using ll=long long; // マクロの定義 #define all(x) x.begin(), x.end() #define len(x) ll(x.size()) #define elif else if #define unless(cond) if (!(cond)) // オーバーロードマクロ #define overload2(_1, _2, name, ...) name #define overload3(_1, _2, _3, name, ...) name #define overload4(_1, _2, _3, _4, name, ...) name #define overload5(_1, _2, _3, _4, _5, name, ...) name // 繰り返し系 #define rep1(n) for (ll i=0; i T floor(T x, U y){return (x>0 ? x/y: (x-y+1)/y);} template T ceil(T x, U y){return (x>0 ? (x+y-1)/y: x/y);} template T mod(T x, U y){ T q=floor(x,y); return x-q*y; } template pair divmod(T x, U y){ T q=floor(x,y); return {q,x-q*y}; } // 指数に関する関数 ll intpow(ll x, ll y){ ll a=1; while (y){ if (y&1) a*=x; x*=x; y>>=1; } return a; } ll modpow(ll x, ll y, ll z){ ll a=1; while (y){ if (y&1) (a*=x)%=z; (x*=x)%=z; y>>=1; } return a; } ll sum(vector &X){ ll y=0; for (auto &&x: X) y+=x; return y; } template T sum(vector &X){ T y=T(0); for (auto &&x: X) y+=x; return y; } // max, min template inline bool chmax(T &a, const U b){ return (a inline bool chmin(T &a, const U b){ return (a>b ? a=b, 1: 0); } template constexpr auto max(T... a){ return max(initializer_list>{a...}); } template constexpr auto min(T... a){ return min(initializer_list>{a...}); } template T max(vector X){ T alpha=X[0]; for (auto x:X) chmax(alpha, x); return alpha; } template T min(vector X){ T alpha=X[0]; for (auto x:X) chmin(alpha, x); return alpha; } // 入出力 template void input(T&... a){(cin >> ... >> a);} void print(){cout << "\n";} template void print(const T& a, const Ts&... b){ cout << a; (cout << ... << (cout << " ", b)); cout << "\n"; } template istream &operator>>(istream &is, pair &P){ is >> P.first >> P.second; return is; } template ostream &operator<<(ostream &os, const pair &P){ os << P.first << " " << P.second; return os; } template vector vector_input(int N, int index){ vector X(N+index); for (int i=index; i> X[i]; return X; } template istream &operator>>(istream &is, vector &X){ for (auto &x: X) is >> x; return is; } template ostream &operator<<(ostream &os, const vector &X){ int N=(int)len(X); rep(i,N) os << (i ? " ": "") << X[i]; return os; } template struct Extended_Algebra{ private: A val; int inf; public: Extended_Algebra(): Extended_Algebra(0,0){} Extended_Algebra(A val): Extended_Algebra(val,0){} Extended_Algebra(A val, int inf): val(val), inf(inf>0? 1:(inf<0?-1:0)){} // マイナス元 Extended_Algebra operator-() const { return Extended_Algebra(-val, -inf);} // 正の元? bool is_positive(bool zero=true) const { if (inf==1) return true; if (inf==-1) return false; if (zero) return val>=0; return val>0; } // 負の元? bool is_negative(bool zero=true) const { if (inf==-1) return true; if (inf==1) return false; if (zero) return val<=0; return val<0; } // 0 ? inline bool is_zero() const {return inf==0 && val==0;} // 有界? inline bool is_bounded() const {return inf==0;} // 加法 Extended_Algebra& operator+=(const Extended_Algebra &y){ assert (!((inf==1 && y.inf==-1)||(inf==-1 && y.inf==1))); if (inf==0 && y.inf==0){ val+=y.val; }else if(inf==1 || y.inf==1){ inf=1; }else{ inf=-1; } return *this; } friend Extended_Algebra operator+(const Extended_Algebra &x, const Extended_Algebra &y) {return Extended_Algebra(x)+=y;} // 減法 Extended_Algebra& operator-=(const Extended_Algebra &y){ assert (!((inf==1 && y.inf==1)||(inf==-1 && y.inf==-1))); if (inf==0 && y.inf==0){ val-=y.val; }else if(inf==1 || y.inf==-1){ inf=1; }else{ inf=-1; } return *this; } friend Extended_Algebra operator-(const Extended_Algebra &x, const Extended_Algebra &y) {return Extended_Algebra(x)-=y;} // 乗法 Extended_Algebra& operator*=(const Extended_Algebra &y){ if (is_zero() || y.is_zero()){ val=0; inf=0; }else{ if (is_bounded() && y.is_bounded()){ val*=y.val; } else if (!(is_positive() ^ y.is_positive())) {inf=1;} else {inf=-1;} } return *this; } friend Extended_Algebra operator*(const Extended_Algebra &x, const Extended_Algebra &y) {return Extended_Algebra(x)*=y;} // 除法 Extended_Algebra& operator/=(const Extended_Algebra &y){ assert (is_bounded() || y.is_bounded()); assert (!y.is_zero()); if (is_bounded()){ if (y.is_bounded()) val/=y.val; else val=0; }else if (y.is_negative()){ inf=-inf; } return *this; } friend Extended_Algebra operator/(const Extended_Algebra &x, const Extended_Algebra &y) {return Extended_Algebra(x)/=y;} // 比較 friend bool operator==(const Extended_Algebra &x, const Extended_Algebra &y) { if (x.inf!=0) return x.inf==y.inf; return (y.inf==0) && x.val==y.val; } friend bool operator<(const Extended_Algebra &x, const Extended_Algebra &y){ if (x.inf==1) return false; if (x.inf==0) return (y.inf==1) || (y.inf==0 && x.val=0; } friend bool operator!=(const Extended_Algebra &x, const Extended_Algebra &y) {return !(x==y);} friend bool operator> (const Extended_Algebra &x, const Extended_Algebra &y) {return y=(const Extended_Algebra &x, const Extended_Algebra &y) {return (x>y) || (x==y);} // 入力 friend istream &operator>>(istream &is, Extended_Algebra &x) { is >> x.val; return (is); } // 出力 friend ostream &operator<<(ostream &os, const Extended_Algebra &x) { if (x.inf==1) {return cout << "inf";} if (x.inf==-1) {return cout << "-inf";} return os << x.val; } }; // 無限大の元 template Extended_Algebra infinity(){return Extended_Algebra(A(),1);} using T=Extended_Algebra; int main(){ int N,M; input(N,M); vector H=vector_input(N,1); vector> S(N+1); int x,y; rep(M){ input(x,y); S[x].emplace_back(y); S[y].emplace_back(x); } T inf=infinity(); // チェリーちゃん vector> DP_c(N+1, {-inf,-inf}); DP_c[1][0]=0; rep(a,1,N+1){ foreach(b,S[a]){ if (a> DP_z(N+1, {-inf,-inf}); DP_z[N][0]=0; for (int a=N; a>=1; a--){ foreach(b,S[a]){ if (a>b){ if (H[a]-inf) ? max(DP_c[N]): -1); print((max(DP_z[1])>-inf) ? max(DP_z[1]): -1); }