#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<map>
#include<ctime>
#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<bitset>
#include<functional>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define REP(i,l,r) for((i)=(l);(i)<=(r);++(i))
#define REP2(i,l,r) for((i)=(l);(i)!=(r);++(i))
using namespace std;
typedef long long LL;
typedef double ld;
const int MAX=1000000+10;
int n,m,Mod;
int begin[MAX],next[MAX*2],t[MAX*2],tot;
int q[MAX],fac[MAX],lonely,down[MAX],up[MAX],in[MAX],fa[MAX];
bool hash[MAX];
void add(int a,int b)
{
t[++tot]=b;
next[tot]=begin[a];
begin[a]=tot;
}
int top;
pair<int,int> toWork[MAX];
LL get()
{
int i;
int numone=0,numtwo=0,numto=1;
for(i=1;i<=top;++i)
{
int e=toWork[i].x;
if(e==1)
++numone;
else
{
++numtwo;
numto=toWork[i].y;
}
}
if(numtwo>1)
return 0;
return (LL)fac[numone]*numto % Mod;
}
LL BFS(int S)
{
int head,end,num=0,nume=0;
head=end=1;
q[end++]=S;
hash[S]=true;
while(head<end)
{
int u=q[head++];
++num;
for(int i=begin[u];i;i=next[i])
{
int v=t[i];
++nume;
if(!hash[v])
{
fa[v]=u;
q[end++]=v;
hash[v]=1;
}
}
}
if(2*(num-1)!=nume)
return 0;
if(num==1)
{
++lonely;
return 1;
}
if(num==2)
return 2;
int i,j;
down[0]=1;
for(i=num;i>=1;--i)
{
int u=q[i];
top=0;
for(j=begin[u];j;j=next[j])
{
int v=t[j];
if(fa[v]!=u)
continue;
toWork[++top]=mp(in[v],down[v]);
}
down[u]=get();
}
up[S]=1;
REP(i,1,num)
{
int u=q[i];
int numOne=0,numTwo=0,numto0=-1,numto2=-1;
for(j=begin[u];j;j=next[j])
{
int v=t[j];
if(fa[v]!=u)
continue;
if(in[v]==1)
++numOne;
else
{
++numTwo;
if(numto0!=-1)
numto2=down[v];
else numto0=down[v];
}
}
if(fa[u])
{
if(in[ fa[u] ]==1)
++numOne;
else
{
++numTwo;
if(numto0!=-1)
numto2=up[u];
else numto0=up[u];
}
}
for(j=begin[u];j;j=next[j])
{
int v=t[j];
if(fa[v]!=u)
continue;
int nowOne=numOne;
int nowTwo=numTwo;
int nowTo=1;
if(in[v]==1)
{
--nowOne;
nowTo=numto0;
}
else
{
--nowTwo;
if(numto0==down[v])
nowTo=numto2;
else nowTo=numto0;
}
if(nowTwo>1)
up[v]=0;
else up[v]=(LL)fac[nowOne]*abs(nowTo)%Mod;
}
}
LL cc=0;
REP(i,1,num)
{
int u=q[i];
if(in[u]!=1)
continue;
top=0;
for(j=begin[u];j;j=next[j])
{
int v=t[j];
if(v==fa[u])
;
else toWork[++top]=mp(in[v],down[v]);
}
if(fa[u])
toWork[++top]=mp(in[fa[u]],up[u]);
LL tmp=get();
cc+=tmp;
if(cc>=Mod)
cc-=Mod;
}
return cc*2 % Mod ;
}
int main()
{
int i;
int a,b;
scanf("%d%d%d",&n,&m,&Mod);
if(m>2*(n-1))
{
printf("0\n");
return 0;
}
REP(i,1,m)
{
scanf("%d%d",&a,&b);
++in[a];
++in[b];
add(a,b);
add(b,a);
}
fac[0]=1;
REP2(i,1,MAX)
fac[i]=(LL)fac[i-1]*i % Mod;
LL ans=1,tot=0;
REP(i,1,n)
if(!hash[i])
{
ans=ans* BFS(i) % Mod;
if(begin[i])
++tot;
}
ans=ans*fac[tot]%Mod;
for(;lonely;lonely--)
ans=ans* (n-lonely+2) % Mod;
cout<<ans<<endl;
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxjc3RkbGliPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxmc3RyZWFtPgojaW5jbHVkZTxtYXA+CiNpbmNsdWRlPGN0aW1lPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxiaXRzZXQ+CiNpbmNsdWRlPGZ1bmN0aW9uYWw+CiNkZWZpbmUgeCBmaXJzdAojZGVmaW5lIHkgc2Vjb25kCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgUkVQKGksbCxyKSBmb3IoKGkpPShsKTsoaSk8PShyKTsrKyhpKSkKI2RlZmluZSBSRVAyKGksbCxyKSBmb3IoKGkpPShsKTsoaSkhPShyKTsrKyhpKSkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIExMOwp0eXBlZGVmIGRvdWJsZSBsZDsKCmNvbnN0IGludCBNQVg9MTAwMDAwMCsxMDsKCmludCBuLG0sTW9kOwoKaW50IGJlZ2luW01BWF0sbmV4dFtNQVgqMl0sdFtNQVgqMl0sdG90OwppbnQgcVtNQVhdLGZhY1tNQVhdLGxvbmVseSxkb3duW01BWF0sdXBbTUFYXSxpbltNQVhdLGZhW01BWF07CmJvb2wgaGFzaFtNQVhdOwoKdm9pZCBhZGQoaW50IGEsaW50IGIpCnsKCXRbKyt0b3RdPWI7CgluZXh0W3RvdF09YmVnaW5bYV07CgliZWdpblthXT10b3Q7Cn0KCmludCB0b3A7CnBhaXI8aW50LGludD4gdG9Xb3JrW01BWF07CgpMTCBnZXQoKQp7CglpbnQgaTsKCWludCBudW1vbmU9MCxudW10d289MCxudW10bz0xOwoJZm9yKGk9MTtpPD10b3A7KytpKQoJewoJCWludCBlPXRvV29ya1tpXS54OwoJCWlmKGU9PTEpCgkJCSsrbnVtb25lOwoJCWVsc2UKCQl7CgkJCSsrbnVtdHdvOwoJCQludW10bz10b1dvcmtbaV0ueTsKCQl9Cgl9CglpZihudW10d28+MSkKCQlyZXR1cm4gMDsKCXJldHVybiAoTEwpZmFjW251bW9uZV0qbnVtdG8gJSBNb2Q7Cn0KCkxMIEJGUyhpbnQgUykKewoJaW50IGhlYWQsZW5kLG51bT0wLG51bWU9MDsKCWhlYWQ9ZW5kPTE7CglxW2VuZCsrXT1TOwoJaGFzaFtTXT10cnVlOwoJd2hpbGUoaGVhZDxlbmQpCgl7CgkJaW50IHU9cVtoZWFkKytdOwoJCSsrbnVtOwoJCWZvcihpbnQgaT1iZWdpblt1XTtpO2k9bmV4dFtpXSkKCQl7CgkJCWludCB2PXRbaV07CgkJCSsrbnVtZTsKCQkJaWYoIWhhc2hbdl0pCgkJCXsKCQkJCWZhW3ZdPXU7CgkJCQlxW2VuZCsrXT12OwoJCQkJaGFzaFt2XT0xOwoJCQl9CgkJfQoJfQoJaWYoMioobnVtLTEpIT1udW1lKQoJCXJldHVybiAwOwoJaWYobnVtPT0xKQoJewoJCSsrbG9uZWx5OwoJCXJldHVybiAxOwoJfQoJaWYobnVtPT0yKQoJCXJldHVybiAyOwoJaW50IGksajsKCWRvd25bMF09MTsKCWZvcihpPW51bTtpPj0xOy0taSkKCXsKCQlpbnQgdT1xW2ldOwoJCXRvcD0wOwoJCWZvcihqPWJlZ2luW3VdO2o7aj1uZXh0W2pdKQoJCXsKCQkJaW50IHY9dFtqXTsKCQkJaWYoZmFbdl0hPXUpCgkJCQljb250aW51ZTsKCQkJdG9Xb3JrWysrdG9wXT1tcChpblt2XSxkb3duW3ZdKTsKCQl9CgkJZG93blt1XT1nZXQoKTsKCX0KCXVwW1NdPTE7CglSRVAoaSwxLG51bSkKCXsKCQlpbnQgdT1xW2ldOwoJCWludCBudW1PbmU9MCxudW1Ud289MCxudW10bzA9LTEsbnVtdG8yPS0xOwoJCWZvcihqPWJlZ2luW3VdO2o7aj1uZXh0W2pdKQoJCXsKCQkJaW50IHY9dFtqXTsKCQkJaWYoZmFbdl0hPXUpCgkJCQljb250aW51ZTsKCQkJaWYoaW5bdl09PTEpCgkJCQkrK251bU9uZTsKCQkJZWxzZQoJCQl7CgkJCQkrK251bVR3bzsKCQkJCWlmKG51bXRvMCE9LTEpCgkJCQkJbnVtdG8yPWRvd25bdl07CgkJCQllbHNlIG51bXRvMD1kb3duW3ZdOwoJCQl9CgkJfQoJCWlmKGZhW3VdKQoJCXsKCQkJaWYoaW5bIGZhW3VdIF09PTEpCgkJCQkrK251bU9uZTsKCQkJZWxzZQoJCQl7CgkJCQkrK251bVR3bzsKCQkJCWlmKG51bXRvMCE9LTEpCgkJCQkJbnVtdG8yPXVwW3VdOwoJCQkJZWxzZSBudW10bzA9dXBbdV07CgkJCX0KCQl9CgkJZm9yKGo9YmVnaW5bdV07ajtqPW5leHRbal0pCgkJewoJCQlpbnQgdj10W2pdOwoJCQlpZihmYVt2XSE9dSkKCQkJCWNvbnRpbnVlOwoJCQlpbnQgbm93T25lPW51bU9uZTsKCQkJaW50IG5vd1R3bz1udW1Ud287CgkJCWludCBub3dUbz0xOwoJCQlpZihpblt2XT09MSkKCQkJewoJCQkJLS1ub3dPbmU7CgkJCQlub3dUbz1udW10bzA7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQktLW5vd1R3bzsKCQkJCWlmKG51bXRvMD09ZG93blt2XSkKCQkJCQlub3dUbz1udW10bzI7CgkJCQllbHNlIG5vd1RvPW51bXRvMDsKCQkJfQoJCQlpZihub3dUd28+MSkKCQkJCXVwW3ZdPTA7CgkJCWVsc2UgdXBbdl09KExMKWZhY1tub3dPbmVdKmFicyhub3dUbyklTW9kOwoJCX0KCX0KCUxMIGNjPTA7CglSRVAoaSwxLG51bSkKCXsKCQlpbnQgdT1xW2ldOwoJCWlmKGluW3VdIT0xKQoJCQljb250aW51ZTsKCQl0b3A9MDsKCQlmb3Ioaj1iZWdpblt1XTtqO2o9bmV4dFtqXSkKCQl7CgkJCWludCB2PXRbal07CgkJCWlmKHY9PWZhW3VdKQoJCQkJOwoJCQllbHNlIHRvV29ya1srK3RvcF09bXAoaW5bdl0sZG93blt2XSk7CgkJfQoJCWlmKGZhW3VdKQoJCQl0b1dvcmtbKyt0b3BdPW1wKGluW2ZhW3VdXSx1cFt1XSk7CgkJTEwgdG1wPWdldCgpOwoJCWNjKz10bXA7CgkJaWYoY2M+PU1vZCkKCQkJY2MtPU1vZDsKCX0KCXJldHVybiBjYyoyICUgTW9kIDsKfQoKaW50IG1haW4oKQp7CglpbnQgaTsKCWludCBhLGI7CglzY2FuZigiJWQlZCVkIiwmbiwmbSwmTW9kKTsKCWlmKG0+Mioobi0xKSkKCXsKCQlwcmludGYoIjBcbiIpOwoJCXJldHVybiAwOwoJfQoJUkVQKGksMSxtKQoJewoJCXNjYW5mKCIlZCVkIiwmYSwmYik7CgkJKytpblthXTsKCQkrK2luW2JdOwoJCWFkZChhLGIpOwoJCWFkZChiLGEpOwoJfQoJZmFjWzBdPTE7CglSRVAyKGksMSxNQVgpCgkJZmFjW2ldPShMTClmYWNbaS0xXSppICUgTW9kOwoJTEwgYW5zPTEsdG90PTA7CglSRVAoaSwxLG4pCgkJaWYoIWhhc2hbaV0pCgkJewoJCQlhbnM9YW5zKiBCRlMoaSkgJSBNb2Q7CgkJCWlmKGJlZ2luW2ldKQoJCQkJKyt0b3Q7CgkJfQoJYW5zPWFucypmYWNbdG90XSVNb2Q7Cglmb3IoO2xvbmVseTtsb25lbHktLSkKCQlhbnM9YW5zKiAobi1sb25lbHkrMikgJSBNb2Q7Cgljb3V0PDxhbnM8PGVuZGw7CglyZXR1cm4gMDsKfQo=