#include<stdio.h>
#include<iostream>
#include <list>
#define M 1000000007
using namespace std;
int cnt;
class Graph
{
int V;
list<int> *adj;
public:
void dfs(int ,bool *);
Graph(int );
void addEdge(int , int );
};
Graph::Graph(int V)
{
this->V = V;
adj = new list<int>[V];
}
void Graph::addEdge(int v, int w)
{
adj[v].push_back(w);
}
void Graph::dfs(int v,bool visited[])
{
cnt++;
visited[v] = true;
list<int>::iterator i;
for(i = adj[v].begin(); i != adj[v].end(); ++i)
if(!visited[*i])
dfs(*i,visited);
}
int main()
{
int T,n,m,i,x,y,ans;
long long count[100005];
long long int prod;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
Graph g(n);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
g.addEdge(x-1, y-1);
g.addEdge(y-1, x-1);
}
bool *visited= new bool[n];
for(i = 0; i <n; i++)
visited[i] = false;
for(i=0;i<n;i++)
{
cnt=0;
if(!visited[i])
g.dfs(i,visited);
count[i]=cnt;
}
prod=1,ans=0;
for(i=0;i<n;i++)
{
if(count[i]!=0)
{
ans++;
prod=((prod%M)*(count[i]%M))%M;
}
}
printf("%d %lld\n",ans,prod);
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlIDxsaXN0PgojZGVmaW5lIE0gMTAwMDAwMDAwNyAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IGNudDsgCiAKY2xhc3MgR3JhcGgKewogICAgaW50IFY7ICAgIAogICAgbGlzdDxpbnQ+ICphZGo7ICAgIAogICAgcHVibGljOgogICAgdm9pZCBkZnMoaW50ICxib29sICopOwogICAgR3JhcGgoaW50ICk7ICAgCiAgICB2b2lkIGFkZEVkZ2UoaW50ICwgaW50ICk7ICAgCiAgICAKfTsKIApHcmFwaDo6R3JhcGgoaW50IFYpCnsKICAgIHRoaXMtPlYgPSBWOwogICAgYWRqID0gbmV3IGxpc3Q8aW50PltWXTsKICAgIAp9CiAKdm9pZCBHcmFwaDo6YWRkRWRnZShpbnQgdiwgaW50IHcpCnsKICAgIGFkalt2XS5wdXNoX2JhY2sodyk7IAp9CiAKdm9pZCBHcmFwaDo6ZGZzKGludCB2LGJvb2wgdmlzaXRlZFtdKQp7CiAgICAgY250Kys7CiAgICAKICAgIHZpc2l0ZWRbdl0gPSB0cnVlOwogICAgCiAKICAgIAogICAgbGlzdDxpbnQ+OjppdGVyYXRvciBpOwogICAgZm9yKGkgPSBhZGpbdl0uYmVnaW4oKTsgaSAhPSBhZGpbdl0uZW5kKCk7ICsraSkKICAgICAgICBpZighdmlzaXRlZFsqaV0pCiAgICAgICAgICAgIGRmcygqaSx2aXNpdGVkKTsKfQogCiAKIAogCmludCBtYWluKCkKewogICAgCiAgICBpbnQgVCxuLG0saSx4LHksYW5zOwogICAgbG9uZyBsb25nIGNvdW50WzEwMDAwNV07CiAgICBsb25nIGxvbmcgaW50IHByb2Q7CiAgICBzY2FuZigiJWQiLCZUKTsKICAgIHdoaWxlKFQtLSkKICAgIHsKICAgICAgICBzY2FuZigiJWQlZCIsJm4sJm0pOwogICAgICAgIEdyYXBoIGcobik7CiAgICAgICAgZm9yKGk9MTtpPD1tO2krKykKICAgICAgICB7CiAgICAgICAgICAgICBzY2FuZigiJWQlZCIsJngsJnkpOyAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgZy5hZGRFZGdlKHgtMSwgeS0xKTsKICAgICAgICAgICAgIGcuYWRkRWRnZSh5LTEsIHgtMSk7CiAgICAgICAgfQogICAgICAgIGJvb2wgKnZpc2l0ZWQ9IG5ldyBib29sW25dOwogICAgICAgIGZvcihpID0gMDsgaSA8bjsgaSsrKQogICAgICAgIHZpc2l0ZWRbaV0gPSBmYWxzZTsKICAgICAgICBmb3IoaT0wO2k8bjtpKyspCiAgICAgICAgewogICAgICAgIAljbnQ9MDsgIAogICAgICAgICAgICBpZighdmlzaXRlZFtpXSkgICAgICAgICAgICAKICAgICAgICAgICAgZy5kZnMoaSx2aXNpdGVkKTsKICAgICAgICAgICAgY291bnRbaV09Y250OwogICAgICAgIH0KICAgICAgIHByb2Q9MSxhbnM9MDsKICAgICAgIGZvcihpPTA7aTxuO2krKykKICAgICAgIHsKICAgICAgICAgCiAgICAgICAgIGlmKGNvdW50W2ldIT0wKQogICAgICAgICB7CiAgICAgICAgICAgICBhbnMrKzsgICAgICAgICAgIAogICAgICAgICAgICAgcHJvZD0oKHByb2QlTSkqKGNvdW50W2ldJU0pKSVNOwogICAgICAgICB9CiAgICAgICB9IAogICAgICAgcHJpbnRmKCIlZCAlbGxkXG4iLGFucyxwcm9kKTsKICAgIH0KICAgIAogCiAgICByZXR1cm4gMDsKfQ==