rt
#include<bits/stdc++.h>
#define N 100005
#define M 300005
using namespace std;
int n,m,u0,v0,cnt,cnt2,dfncnt;
int h[N],h2[N],dfn[M],low[M],pt[N],inv[N],stk[N],sz[N],vis[N],fg,top,sum;
map<int,int>mp[N];
struct node{
int v,nxt;
}e[M],e2[M];
void add(int u,int v){
e[++cnt].v=v,e[cnt].nxt=h[u],h[u]=cnt;
}
void add2(int u,int v){
e2[++cnt2].v=v,e2[cnt2].nxt=h2[u],h2[u]=cnt2;
}
void tarjan(int u){
dfn[u]=low[u]=++dfncnt;
stk[++top]=u;vis[u]=1;
for(int i=h[u];i;i=e[i].nxt){
int v=e[i].v;
if(vis[v]==2)continue;
if(!vis[v])tarjan(v);
low[u]=min(low[u],low[v]);
}
if(dfn[u]==low[u]){
int p;cnt++;
while(stk[top+1]^u)
p=stk[top--],sz[cnt]++,vis[p]=2,pt[p]=cnt;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{scanf("%d%d",&u0,&v0);add(u0,v0);}cnt=0;
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++){
for(int j=h[i];j;j=e[j].nxt){
int v=e[j].v;
if(mp[pt[i]][pt[v]])continue;
if(pt[i]^pt[v]){
add2(pt[i],pt[v]);
inv[pt[v]]++,mp[pt[i]][pt[v]]=1;
}
}
}
for(int i=1;i<=cnt;i++)
{sum+=(inv[i]==0);}
for(int i=1;i<=cnt;i++){
bool flag=1;
for(int j=h2[i];j;j=e2[j].nxt){
if(inv[pt[e2[j].v]]<2)flag=0;
}if(flag&&!inv[i]&&sz[i]==1)fg=1;
}sum-=fg;
double ans=1-(double)sum/n;
return printf("%.6lf",ans),0;
}