#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n,m;
vector<int>e[N];
int dfn[N],low[N],tot,stk[N],top;
bool instk[N];
int scc[N],sc,sz[N];
void tj(int now){
dfn[now]=low[now]=++tot,stk[++top]=now,instk[now]=1;
for(int to:e[now]){
if(!dfn[to]){
tj(to);
low[now]=min(low[now],low[to]);
}else if(instk[to]){
low[now]=min(low[now],dfn[to]);
}
}
if(dfn[now]==low[now]){
sc++;
while (stk[top]!=now)
{
scc[stk[top]]=sc;
sz[sc]++;
instk[stk[top]]=0;
top--;
}
scc[stk[top]]=sc;
sz[sc]++;
instk[stk[top]]=0;
top--;
}
}
int in[N];
vector<int>ee[N];
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1,u,v;i<=m;i++){
cin>>u>>v;
e[u].push_back(v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tj(i);
bool vis[N];
for(int i=1;i<=n;i++){
for(int j:e[i]){
if(scc[i]!=scc[j] && !vis[scc[j]]){
in[scc[j]]++;
vis[scc[j]]=1;
ee[scc[i]].push_back(scc[j]);
}
}
for(int j:e[i]) vis[scc[j]]=0;
}
int ans=0;bool tmp=0;
for(int i=1;i<=sc;i++){
if(in[i]==0){
ans++;
if(sz[i]==1){
bool flag=1;
for(int j:ee[i]){
if(in[j]==1) flag=0;
}
tmp|=flag;
}
}
}
cout<<fixed<<setprecision(6)<<(double)(n-ans+tmp)/n;
return 0;
}