#include using namespace std; using ll=long long; using ull=unsigned long long; using P=pair; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templateistream &operator>>(istream &is,pair&p){is>>p.first>>p.second;return is;} templateistream &operator>>(istream &is,tuple&a){is>>std::get<0>(a)>>std::get<1>(a)>>std::get<2>(a);return is;} templateistream &operator>>(istream &is,array&a){for(auto&i:a)is>>i;return is;} templateistream &operator>>(istream &is,vector &a){for(auto &i:a)is>>i;return is;} templatevoid operator++(pair&a,int n){a.first++,a.second++;} templatevoid operator--(pair&a,int n){a.first--,a.second--;} templatevoid operator++(vector&a,int n){for(auto &i:a)i++;} templatevoid operator--(vector&a,int n){for(auto &i:a)i--;} #define overload3(_1,_2,_3,name,...) name #define rep1(i,n) for(int i=0;i<(int)(n);i++) #define rep2(i,l,r) for(int i=(int)(l);i<(int)(r);i++) #define rep(...) overload3(__VA_ARGS__,rep2,rep1)(__VA_ARGS__) #define reps(i,l,r) rep2(i,l,r) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcountll(x) #define fin(x) return cout<<(x)<<'\n',static_cast(0) #define yn(x) cout<<((x)?"Yes\n":"No\n") #define uniq(x) sort(all(x)),x.erase(unique(all(x)),x.end()) template inline int fkey(vector&z,T key){return lower_bound(z.begin(),z.end(),key)-z.begin();} ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } #ifdef LOCAL #include #define SWITCH(a,b) (a) #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) #define SWITCH(a,b) (b) templateostream &operator<<(ostream &os,const pair&p){os<>testcase; for(int i=0;i #include struct gf2{ private: unsigned long long v; static constexpr unsigned long long table[16]={0,27,45,54,90,65,119,108,175,180,130,153,245,238,216,195}; public: gf2():v(){} template gf2(T x):v(x){} inline gf2 operator+()const{return *this;} inline gf2 operator-()const{return *this;} inline gf2 &operator+=(const gf2&rhs){v^=rhs.v;return *this;} inline gf2 &operator-=(const gf2&rhs){v^=rhs.v;return *this;} __attribute__((target("pclmul,sse4.2"))) inline gf2 &operator*=(const gf2&rhs){ __m128i m=_mm_clmulepi64_si128(_mm_set_epi64x(0,v),_mm_set_epi64x(0,rhs.v),0); unsigned long long high=_mm_extract_epi64(m,1); unsigned long long low=_mm_extract_epi64(m,0); v=high^(high<<1); low^=v^(v<<3); v=low^table[high>>60]; return *this; } inline gf2 &operator/=(const gf2&rhs){return *this*=rhs.inv();} friend gf2 operator+(const gf2&lhs,const gf2&rhs){return gf2(lhs)+=rhs;} friend gf2 operator-(const gf2&lhs,const gf2&rhs){return gf2(lhs)-=rhs;} friend gf2 operator*(const gf2&lhs,const gf2&rhs){return gf2(lhs)*=rhs;} friend gf2 operator/(const gf2&lhs,const gf2&rhs){return gf2(lhs)/=rhs;} auto operator<=>(const gf2&)const=default; gf2 pow(unsigned long long k)const{ gf2 res=1,a=*this; while(k){ if(k&1)res*=a; a*=a; k>>=1; } return res; } inline gf2 inv()const{return pow(-2);} unsigned long long val()const{return v;} friend std::istream &operator>>(std::istream&is,gf2&rhs){is>>rhs.v;return is;} friend std::ostream &operator<<(std::ostream&os,const gf2&rhs){os< namespace Random{ std::mt19937_64 mt(std::random_device{}()); templateinline std::enable_if_t,T> get(){return mt();} templateinline std::enable_if_t,T> get(){return T(mt())/T(-1ull);} templateinline std::enable_if_t,T>range(T n){return mt()%n;} templateinline std::enable_if_t,T>range(T l,T r){return l+mt()%(r-l);} templateinline std::enable_if_t,std::pair>distinct(T n){ T l=mt()%n,r=mt()%(n-1); if(l==r)r++; if(l>r)std::swap(l,r); return std::make_pair(l,r); } } void SOLVE(){ int n,m; cin>>n>>m; int x,y,z; cin>>x>>y>>z; x--,y--,z--; vector>edge(n,vector(n)); rep(i,m){ int u,v; cin>>u>>v; u--,v--; edge[u][v]=edge[v][u]=true; } rep(i,n)edge[i][i]=true; debugg(edge); vector>g(n,vector(n)); rep(i,n)rep(j,i+1,n)if(!edge[i][j]){ g[i][j]=g[j][i]=Random::get(); } auto dp=vec({4,n,n}); dp[0][x][x]=1; vectormask(n); mask[y]=1,mask[z]=2; rep(len,1,n+1){ auto ndp=vec({4,n,n}); rep(i,4)rep(j,n)rep(k,n)if(dp[i][j][k].val()){ rep(l,n)if(j!=l&&l!=x&&!edge[k][l]&&(i&mask[l])==0){ ndp[i|mask[l]][k][l]+=dp[i][j][k]*g[k][l]; } } dp=move(ndp); rep(i,n)if(!edge[x][i]){ gf2 s=0; rep(j,n)s+=dp[3][j][i]; if(s.val()){ debug(len,i); fin(len+1); } } } cout<<"-1\n"; }