#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#define Mod 1000000007
using namespace std;
queue<int> q;
vector<int>::iterator it;
int BFS(int node, vector<int> *adj, int visited[])
{
int count = 1;
q = queue<int>();
visited[node] = 1;
q.push(node);
while(!q.empty())
{
count++;
node = q.front();
q.pop();
for(it=adj[node].begin(); it!=adj[node].end(); it++)
{
if(!visited[*it])
{
visited[*it] = 1;
q.push(*it);
}
}
}
return count;
}
int main()
{
int t,n,m,a,b,Routes,People;
int Ways;
scanf("%d",&t);
while(t--)
{
Routes=0; Ways=1;
scanf("%d%d",&n,&m);
int visited[n+1];
vector<int> *adj = new vector<int>[n+1];
memset(visited,0,sizeof(visited));
for(int i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
adj[a].push_back(b);
adj[b].push_back(a);
}
for(int i=1; i<=n; i++)
{
People = 1;
if(!visited[i])
{
People = BFS(i, adj, visited);
Routes++;
}
if(People>1) Ways = (Ways*People)%Mod;
}
printf("%d %d\n",Routes,People);
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RyaW5nLmg+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8cXVldWU+CiNkZWZpbmUgTW9kIDEwMDAwMDAwMDcgCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpxdWV1ZTxpbnQ+IHE7CnZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdDsKCmludCBCRlMoaW50IG5vZGUsIHZlY3RvcjxpbnQ+ICphZGosIGludCB2aXNpdGVkW10pCnsKICAgIGludCBjb3VudCA9IDE7CiAgICBxID0gcXVldWU8aW50PigpOwogICAgdmlzaXRlZFtub2RlXSA9IDE7CiAgICBxLnB1c2gobm9kZSk7CiAgICB3aGlsZSghcS5lbXB0eSgpKQogICAgewogICAgICAgIGNvdW50Kys7CiAgICAgICAgbm9kZSA9IHEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGZvcihpdD1hZGpbbm9kZV0uYmVnaW4oKTsgaXQhPWFkaltub2RlXS5lbmQoKTsgaXQrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKCF2aXNpdGVkWyppdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpc2l0ZWRbKml0XSA9IDE7CiAgICAgICAgICAgICAgICBxLnB1c2goKml0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgcmV0dXJuIGNvdW50Owp9CgoKaW50IG1haW4oKQp7CiAgaW50IHQsbixtLGEsYixSb3V0ZXMsUGVvcGxlOwogIGludCBXYXlzOwogIHNjYW5mKCIlZCIsJnQpOwogICAgCiAgd2hpbGUodC0tKQogIHsKICAgIFJvdXRlcz0wOyBXYXlzPTE7CiAgICBzY2FuZigiJWQlZCIsJm4sJm0pOwogICAgaW50IHZpc2l0ZWRbbisxXTsKICAgIHZlY3RvcjxpbnQ+ICphZGogPSBuZXcgdmVjdG9yPGludD5bbisxXTsKICAgIG1lbXNldCh2aXNpdGVkLDAsc2l6ZW9mKHZpc2l0ZWQpKTsKICAgIGZvcihpbnQgaT0wOyBpPG07IGkrKykKICAgIHsKICAgICAgICBzY2FuZigiJWQlZCIsJmEsJmIpOwogICAgICAgIGFkalthXS5wdXNoX2JhY2soYik7CiAgICAgICAgYWRqW2JdLnB1c2hfYmFjayhhKTsKICAgIH0KICAgIAogICAgZm9yKGludCBpPTE7IGk8PW47IGkrKykKICAgIHsKICAgICAgICBQZW9wbGUgPSAxOwogICAgICAgIGlmKCF2aXNpdGVkW2ldKQogICAgICAgIHsKICAgICAgICAgICAgUGVvcGxlID0gQkZTKGksIGFkaiwgdmlzaXRlZCk7CiAgICAgICAgICAgIFJvdXRlcysrOwogICAgICAgIH0KICAgICAgICBpZihQZW9wbGU+MSkgIFdheXMgPSAoV2F5cypQZW9wbGUpJU1vZDsKICAgIH0KICAgIHByaW50ZigiJWQgJWRcbiIsUm91dGVzLFBlb3BsZSk7CiAgfQogcmV0dXJuIDA7Cn0=