/*
TASK: trade
LANG: C++
*/

#include <stdio.h>
#include <stdlib.h>
#include <queue.h>

long pred[1000][1000], sled[1000][1000], retailors;
double prices[1000];

void update_price(long long vertex) {
	double sum = 0;
	long i = 0;
	while (i < pred[vertex][0]) {
		if (prices[pred[vertex][i+1]] == 0) {
			//update_price(pred[vertex][i+1]);
		}
		sum += prices[pred[vertex][i+1]];
		i++;
	}
	sum /= pred[vertex][0];
	if (sled[vertex][0] != 0) {
		sum += (double)1/sled[vertex][0];
	}
	prices[vertex] = sum;
}

int cmp(const void *a, const void *b) {
	return pred[*(long*)a][0]-pred[*(long*)b][0];
}

void bfs() {
	int used[1024] = {0};
	long i, cur;
	queue<long> Q;
	Q.push(0);
	while (Q.size()) {
		cur = Q.front();
		Q.pop();
		i = 0;
		//qsort(&sled[cur][1], sled[cur][0], sizeof(long), cmp);
		while (i < sled[cur][0]) {
			if (!used[sled[cur][i+1]]) {
				Q.push(sled[cur][i+1]);
				update_price(sled[cur][i+1]);
				used[sled[cur][i+1]] = 1;
			}
			i++;
		}
	}
}

int main() {
	long connections, i = 0, e1, e2;
	scanf("%li %li", &retailors, &connections);
	prices[0] = 1;
	while (i < connections) {
		scanf("%li %li", &e1, &e2);
		sled[e1][++sled[e1][0]] = e2;
		pred[e2][++pred[e2][0]] = e1;
		i++;
	}
	bfs();
	double min = -1;
	i = 1;
	while (i <= retailors) {
		if (sled[i][0] == 0) {
			if (prices[i] < min || min == -1) {
				min = prices[i];
			}
		}
		i++;
	}
	printf("%.6lf\n", min);
	system("PAUSE");
	return 0;
}
