#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct X
{
int v,n,f;
}x[1000005],y[1000005];
const int N=1e5+5;
int s,st[N],top,dfn[N],low[N],pa[N],cnt,t,w=-1,q[N],syg[N];
bool vis[N],sf[N];
void add(int u,int v)
{
y[++s].n=y[u].f;
y[y[u].f=s].v=v;
}
void dfs(int u)
{
dfn[u]=low[u]=++s;
vis[st[++top]=u]=sf[u]=1;
for(int i=x[u].f;i;i=x[i].n)
if(!vis[x[i].v]) dfs(x[i].v),low[u]=min(low[x[i].v],low[u]);
else if(sf[x[i].v]) low[u]=min(low[u],dfn[x[i].v]);
if(dfn[u]==low[u])
{
pa[u]=++cnt;
for(;st[top]!=u;top--)
pa[st[top]]=cnt,sf[st[top]]=0;
top--;sf[u]=0;
}
}
int main()
{
int n,m,mod;
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=m;i++)
{
int u;
scanf("%d%d",&u,&x[i].v);
x[i].n=x[u].f;
x[u].f=i;
}
for(int i=1;i<=n;i++)
if(!vis[i]) dfs(i);
memset(st,0,sizeof(st));
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
s=0;
for(int i=1;i<=n;i++)
{
st[pa[i]]++;
for(int j=x[i].f;j;j=x[j].n)
if(pa[i]!=pa[x[j].v]) add(pa[i],pa[x[j].v]),++dfn[pa[x[j].v]];
}
memset(pa,0,sizeof(pa));
memset(low,0,sizeof(low));
for(int i=1;i<=cnt;i++)
if(!dfn[i]) vis[q[++w]=i]=1,low[i]=1,pa[i]=st[i];
for(;t<=w;t++)
{
for(int i=y[q[t]].f;i;i=y[i].n)
if(!vis[y[i].v])
{
dfn[y[i].v]--;
if(!dfn[y[i].v]) vis[q[++w]=y[i].v]=1;
if(syg[y[i].v]==q[t]) continue;
syg[y[i].v]=q[t];
if(st[y[i].v]+pa[q[t]]>pa[y[i].v])
{
pa[y[i].v]=pa[q[t]]+st[y[i].v];
low[y[i].v]=low[q[t]];
}
else if(st[y[i].v]+pa[q[t]]==pa[y[i].v]) low[y[i].v]+=low[q[t]],low[y[i].v]%=mod;
}
}
int ans1=0,ans2;
for(int i=1;i<=cnt;i++)
if(ans1<pa[i]) ans1=pa[i],ans2=low[i];
else if(ans1==pa[i]) ans2+=low[i],ans2%=mod;
printf("%d\n%d",ans1,ans2);
return 0;
}