#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<vector>
#include<queue>
#define Mod 1000000007
using namespace std;
int *visited = (int*)malloc(100005*sizeof(int));
queue<int> q;
vector< vector<int> > adj;
vector<int>::iterator it;
inline int BFS(int node, int visited[])
{
int count = 0;
q = queue<int>();
visited[node] = 1;
q.push(node);
count++;
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,PeopleInRoute;
long long int SelectionWays;
scanf("%d",&t);
while(t--)
{
adj.clear();
Routes=0; SelectionWays=1;
memset(visited,0,sizeof(visited));
scanf("%d%d",&n,&m);
adj.resize(n+1);
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=0; i<=n; i++)
{
PeopleInRoute=1;
if(!visited[i])
{
PeopleInRoute = BFS(i, visited);
Routes++;
}
SelectionWays = (SelectionWays*PeopleInRoute)%Mod;
}
printf("%d %d\n",Routes,PeopleInRoute);
}
free(visited);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8bWFsbG9jLmg+CiNpbmNsdWRlPHN0cmluZy5oPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHF1ZXVlPgojZGVmaW5lIE1vZCAxMDAwMDAwMDA3IAp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50ICp2aXNpdGVkID0gKGludCopbWFsbG9jKDEwMDAwNSpzaXplb2YoaW50KSk7CgpxdWV1ZTxpbnQ+IHE7CnZlY3RvcjwgdmVjdG9yPGludD4gPiBhZGo7CnZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdDsKCmlubGluZSBpbnQgQkZTKGludCBub2RlLCBpbnQgdmlzaXRlZFtdKQp7CiAgICBpbnQgY291bnQgPSAwOwogICAgcSA9IHF1ZXVlPGludD4oKTsKICAgIHZpc2l0ZWRbbm9kZV0gPSAxOwogICAgcS5wdXNoKG5vZGUpOwogICAgY291bnQrKzsKICAgIHdoaWxlKCFxLmVtcHR5KCkpCiAgICB7CiAgICAgICAgY291bnQrKzsKICAgICAgICBub2RlID0gcS5mcm9udCgpOwogICAgICAgIHEucG9wKCk7CiAgICAgICAgZm9yKGl0PWFkaltub2RlXS5iZWdpbigpOyBpdCE9YWRqW25vZGVdLmVuZCgpOyBpdCsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIXZpc2l0ZWRbKml0XSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlzaXRlZFsqaXRdID0gMTsKICAgICAgICAgICAgICAgIHEucHVzaCgqaXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICByZXR1cm4gY291bnQ7Cn0KCgppbnQgbWFpbigpCnsKICBpbnQgdCxuLG0sYSxiLFJvdXRlcyxQZW9wbGVJblJvdXRlOwogIGxvbmcgbG9uZyBpbnQgU2VsZWN0aW9uV2F5czsKICBzY2FuZigiJWQiLCZ0KTsKICAgIAogIHdoaWxlKHQtLSkKICB7CiAgICBhZGouY2xlYXIoKTsKICAgIFJvdXRlcz0wOyBTZWxlY3Rpb25XYXlzPTE7CiAgICBtZW1zZXQodmlzaXRlZCwwLHNpemVvZih2aXNpdGVkKSk7CiAgICBzY2FuZigiJWQlZCIsJm4sJm0pOwogICAgYWRqLnJlc2l6ZShuKzEpOwogICAgZm9yKGludCBpPTA7IGk8bTsgaSsrKQogICAgewogICAgICAgIHNjYW5mKCIlZCVkIiwmYSwmYik7CiAgICAgICAgYWRqW2FdLnB1c2hfYmFjayhiKTsKICAgICAgICBhZGpbYl0ucHVzaF9iYWNrKGEpOwogICAgfQogICAgCiAgICBmb3IoaW50IGk9MDsgaTw9bjsgaSsrKQogICAgewogICAgICAgIFBlb3BsZUluUm91dGU9MTsKICAgICAgICBpZighdmlzaXRlZFtpXSkKICAgICAgICB7CiAgICAgICAgICAgIFBlb3BsZUluUm91dGUgPSBCRlMoaSwgdmlzaXRlZCk7CiAgICAgICAgICAgIFJvdXRlcysrOwogICAgICAgIH0KICAgICAgICBTZWxlY3Rpb25XYXlzID0gKFNlbGVjdGlvbldheXMqUGVvcGxlSW5Sb3V0ZSklTW9kOwogICAgfQogICAgcHJpbnRmKCIlZCAlZFxuIixSb3V0ZXMsUGVvcGxlSW5Sb3V0ZSk7CiAgfQogIGZyZWUodmlzaXRlZCk7CiByZXR1cm4gMDsKfQ==