#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=10e9+7;
int find(int a[],int x)
{
if(x!=a[x])
return find(a,a[x]);
else
return a[x];
}
void union_(int x,int y, int a[])
{
int x1=find(a,x);
int y1=find(a,y);
a[x1]=y1;
}
int main() {
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int a[n+1];
for(int i=0;i<=n;i++)
a[i]=i;
int u,v;
ll s=0,ans=1;
for(int i=0;i<m;i++)
{
cin>>u>>v;
union_(u,v,a);
}
ll hash[n+1];
memset(hash,0,sizeof(hash));
for(int i=1;i<=n;i++)
{
hash[find(a,i)]++;
}
for(int i=1;i<=n;i++)
if(hash[i])
ans=(ans%mod)*(hash[i]%mod)%mod,s++;
cout<<s<<" "<<ans<<endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKbGwgbW9kPTEwZTkrNzsKaW50IGZpbmQoaW50IGFbXSxpbnQgeCkKewoJaWYoeCE9YVt4XSkKCXJldHVybiBmaW5kKGEsYVt4XSk7CgllbHNlCglyZXR1cm4gYVt4XTsKfQp2b2lkIHVuaW9uXyhpbnQgeCxpbnQgeSwgaW50IGFbXSkKewoJaW50IHgxPWZpbmQoYSx4KTsKCWludCB5MT1maW5kKGEseSk7CglhW3gxXT15MTsKfQppbnQgbWFpbigpIHsKCWludCB0OwoJY2luPj50OwoJd2hpbGUodC0tKQoJewogICAgICAgICAgICAgIGludCBuLG07CiAgICAgICAgICAgICAgY2luPj5uPj5tOwogICAgICAgICAgICAgIGludCBhW24rMV07CiAgICAgICAgICAgICAgZm9yKGludCBpPTA7aTw9bjtpKyspCiAgICAgICAgICAgICAgYVtpXT1pOwogICAgICAgICAgICAgIGludCB1LHY7CiAgICAgICAgICAgICAgbGwgcz0wLGFucz0xOwogICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8bTtpKyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgIAljaW4+PnU+PnY7CiAgICAgICAgICAgICAgCXVuaW9uXyh1LHYsYSk7CiAgICAgICAgICAgICAgCSAgIAogICAgICAgICAgICAgIAkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGwgaGFzaFtuKzFdOwogICAgICAgICAgICAgIG1lbXNldChoYXNoLDAsc2l6ZW9mKGhhc2gpKTsKICAgICAgICAgICAgICBmb3IoaW50IGk9MTtpPD1uO2krKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgCWhhc2hbZmluZChhLGkpXSsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IoaW50IGk9MTtpPD1uO2krKykKICAgICAgICAgICAgICBpZihoYXNoW2ldKQogICAgICAgICAgICAgIGFucz0oYW5zJW1vZCkqKGhhc2hbaV0lbW9kKSVtb2QscysrOwogICAgICAgICAgICAgIAogICAgICAgICAgICAgIAogICAgICAgICAgICAgIGNvdXQ8PHM8PCIgIjw8YW5zPDxlbmRsOwoJCX0KCXJldHVybiAwOwp9