#include"cstdio" #include"cstring" #include"cstdlib" #include"cmath" #include"string" #include"map" #include"cstring" #include"iostream" #include"algorithm" #include"queue" #include"stack" #define inf 0x3f3f3f3f #define M 200009 #define eps 1e-8 #define INT int #define LL __int64 using namespace std; struct node { int u,v,next; }edge[M*2]; int head[M]; int dfn[M]; int belong[M]; int low[M]; int use[M]; int sum[M]; int in[M]; int out[M]; int t,indx,num,cnt,m,n; stack<int>q; void init() { t=0; memset(head,-1,sizeof(head)); } void add(int u,int v) { edge[t].u=u; edge[t].v=v; edge[t].next=head[u]; head[u]=t++; } void tarjan(int u) { dfn[u]=low[u]=++indx; q.push(u); use[u]=1; for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].v; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(use[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]) { int p; num++; do { p=q.top(); q.pop(); use[p]=0; belong[p]=num; sum[num]++; }while(p!=u); } } void slove() { num=indx=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(use,0,sizeof(use)); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } if(num==1) { printf("-1\n"); return; } memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for(int i=0;i<t;i++) { int u=edge[i].u; int v=edge[i].v; if(belong[u]!=belong[v]) { out[belong[u]]++; in[belong[v]]++; } } LL ans=0; for(int i=1;i<=num;i++) { if(!out[i]||!in[i]) { LL s=(LL)n*(n-1)-m-(LL)sum[i]*(n-sum[i]); if(ans<s) ans=s; } } printf("%I64d\n",ans); } int main() { int T,a,b,kk=1; cin>>T; while(T--) { scanf("%d%d",&n,&m); init(); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); add(a,b); } printf("Case %d: ",kk++); slove(); } return 0; }