#include using namespace std; using ll=long long; #define all(v) v.begin(),v.end() #define rall(v) v.rbegin(),v.rend() template bool chmax(T &a, T b){if (a < b){a = b;return true;} else return false;} template bool chmin(T &a, T b){if (a > b){a = b;return true;} else return false;} const int INF=1<<30; void Solve(){ int N,M; cin>>N>>M; vector>>G(N); bool flag=false; if(M%2==1)flag=true; for(int i=0;i>a>>b; a--; b--; if(a>b)swap(a,b); if(a==0&&b==N-1){ flag=true; } G[a].push_back({b,i}); G[b].push_back({a,i}); } if(flag){ cout<<-1<<"\n"; return; } auto find_dist=[&](int x,int no)-> vector { queue>q; vectordist(N,INF); q.push({0,x}); dist[x]=0; while(q.size()){ auto[c,y]=q.front(); q.pop(); if(y==no)continue; if(dist[y]isRed(M,-1); int sum=0; for(auto[i,e]:G[0]){ isRed[e]=1; sum++; } for(auto[i,e]:G[N-1]){ isRed[e]=0; } for(int i=0;iM/2){ vectorD=find_dist(N-1,0); vectorisRed(M,-1); int sum=0; for(auto[i,e]:G[0]){ if(D[i]!=INF){ isRed[e]=1; sum++; } } for(auto[i,e]:G[N-1]){ isRed[e]=0; } for(int i=0;iD=find_dist(0,N-1); vectorisRed(M,-1); int sum=0; for(auto[i,e]:G[0]){ isRed[e]=1; sum++; } for(auto[i,e]:G[N-1]){ if(D[i]!=INF)isRed[e]=0; } for(int i=0;i