#include<bits/stdc++.h>
#define MAXSIZE 10000
#define pb push_back
using namespace::std;
int dfs(vector< vector < int> > &g, int v, bool vs[])
{
vs[v] = true;
int count = 1;
for(auto it = g[v].begin() ; it != g[v].end() ; ++it)//auto it : g[v])
if(!vs[*it])
count += dfs(g,*it,vs);
return count;
}
void firesc(vector <vector <int> > &g, int n, vector <int> &result)
{
bool *vs = new bool[n];
vs[0] = true;
for(int i =1 ; i <= n ; ++i)
vs[i] = false;
for(int i = 0 ; i <= n ; ++i)
if(!vs[i])
result.pb(dfs(g,i,vs));
}
int main()
{ //0 1 2 3 4
int T,N,M,a,b,ways = 1; // 2 1 2
vector <int> result; // 3
//cout<<"\nenter T :\t";
cin>>T;
while(T--)
{
// cout<<"\nenter N and M :\t";
cin>>N>>M;
vector <vector <int> > g(N+1);
while(M--)
{
// cout<<"\nenter couples of friends :\t";
cin>>a>>b;
g[a].pb(b);
g[b].pb(a);
}
firesc(g,N,result);
cout<<result.size()<<' '; //cout<<"\n total routes :\t "<<result.size();
for(auto it = result.begin() ; it != result.end() ; ++it ) //int x : result
ways *= (*it);
cout<<ways<<endl; //cout<<"\ntotal ways to select captains "<<ways;
result.clear();
/************************* for(auto it : g)
g[(*it)].clear();*******/
for(int i = 0 ; i<N ; ++i)
g[i].clear();
ways = 1;
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCiNkZWZpbmUgTUFYU0laRSAxMDAwMAojZGVmaW5lIHBiIHB1c2hfYmFjawp1c2luZyBuYW1lc3BhY2U6OnN0ZDsKCmludCBkZnModmVjdG9yPCB2ZWN0b3IgPCBpbnQ+ID4gJmcsIGludCB2LCBib29sIHZzW10pCnsKICAgIHZzW3ZdID0gdHJ1ZTsKICAgIGludCBjb3VudCA9IDE7CiAgICBmb3IoYXV0byBpdCA9IGdbdl0uYmVnaW4oKSA7IGl0ICE9IGdbdl0uZW5kKCkgOyArK2l0KS8vYXV0byBpdCA6IGdbdl0pCiAgICAgICAgaWYoIXZzWyppdF0pCiAgICAgICAgY291bnQgKz0gZGZzKGcsKml0LHZzKTsKICAgIHJldHVybiBjb3VudDsKfQoKdm9pZCBmaXJlc2ModmVjdG9yIDx2ZWN0b3IgPGludD4gPiAmZywgaW50IG4sIHZlY3RvciA8aW50PiAmcmVzdWx0KQp7CiAgICBib29sICp2cyA9IG5ldyBib29sW25dOwogICAgdnNbMF0gPSB0cnVlOwogICAgZm9yKGludCBpID0xIDsgaSA8PSBuIDsgKytpKQogICAgICAgIHZzW2ldID0gZmFsc2U7CiAgICBmb3IoaW50IGkgPSAwIDsgaSA8PSBuIDsgKytpKQogICAgaWYoIXZzW2ldKQogICAgICAgIHJlc3VsdC5wYihkZnMoZyxpLHZzKSk7Cn0KaW50IG1haW4oKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMCAgICAgMSAgIDIgICAzICAgNAogICAgaW50IFQsTixNLGEsYix3YXlzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgMiAgIDEgICAyCiAgICB2ZWN0b3IgPGludD4gcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMwoKICAgIC8vY291dDw8IlxuZW50ZXIgVCA6XHQiOwogICAgY2luPj5UOwogICAgd2hpbGUoVC0tKQogICAgewogICAgICAvLyAgY291dDw8IlxuZW50ZXIgTiBhbmQgTSA6XHQiOwogICAgICAgIGNpbj4+Tj4+TTsKICAgICAgICB2ZWN0b3IgPHZlY3RvciA8aW50PiA+IGcoTisxKTsKICAgICAgICB3aGlsZShNLS0pCiAgICAgICAgewogICAgICAgIC8vICAgIGNvdXQ8PCJcbmVudGVyIGNvdXBsZXMgb2YgZnJpZW5kcyA6XHQiOwogICAgICAgICAgICBjaW4+PmE+PmI7CiAgICAgICAgICAgIGdbYV0ucGIoYik7CiAgICAgICAgICAgIGdbYl0ucGIoYSk7CiAgICAgICAgfQogICAgICAgIGZpcmVzYyhnLE4scmVzdWx0KTsKICAgIGNvdXQ8PHJlc3VsdC5zaXplKCk8PCcgJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3V0PDwiXG4gdG90YWwgcm91dGVzIDpcdCAiPDxyZXN1bHQuc2l6ZSgpOwogICAgZm9yKGF1dG8gaXQgPSByZXN1bHQuYmVnaW4oKSA7IGl0ICE9IHJlc3VsdC5lbmQoKSA7ICsraXQgKSAgICAgICAgICAvL2ludCB4IDogcmVzdWx0CiAgICAgICAgd2F5cyAqPSAoKml0KTsKCiAgICAgICAgIGNvdXQ8PHdheXM8PGVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3V0PDwiXG50b3RhbCB3YXlzIHRvIHNlbGVjdCBjYXB0YWlucyAiPDx3YXlzOwoKICAgIHJlc3VsdC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqIGZvcihhdXRvIGl0IDogZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1soKml0KV0uY2xlYXIoKTsqKioqKioqLwogICAgZm9yKGludCBpID0gMCA7IGk8TiA7ICsraSkKICAgIGdbaV0uY2xlYXIoKTsKICAgIHdheXMgPSAxOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==