#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m;
vector <int> g[maxn],gt[maxn],a;
int dfn[maxn],low[maxn],scc[maxn],e[maxn],scnt,dfnl;
int s[maxn],t,ins[maxn],siz[maxn];
map <pair<int,int>,int> ee;
void tarjan(int u){
dfn[u]=low[u]=++dfnl;
s[++t]=u;ins[u]=1;
for(int v: g[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(ins[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
++scnt;
while(true){
int x=s[t--];
ins[x]=0;
scc[x]=scnt;
siz[scnt]+=1;
if(u==x)break;
}
}
return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
g[x].push_back(y);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=1;i<=n;i++){
for(int v:g[i]){
if(scc[i]!=scc[v]&&ee[{scc[i],scc[v]}]==0){
gt[scc[i]].push_back(scc[v]);
e[scc[v]]++;
ee[{scc[i],scc[v]}]=1;
}
}
}
for(int i=1;i<=scnt;i++){
if(e[i]==0&&siz[i]==1){
a.push_back(i);
}
}
bool flag=false;
int cn=0;
for(int i: a){
cn=0;
for(int j: gt[i]){
if(e[j]<2){
break;
}
else{
cn++;
}
}
if(cn==gt[i].size()){
flag=true;
break;
}
}
double ans=0;
int cnt=a.size();
if(flag){
ans=1.0-((cnt-1.0)/n);
}
else{
ans=1.0-((cnt*1.0)/n);
}
printf("%.6lf",ans);
}