1 #include <cstdio>
2 #include <vector>
3 #include <queue>
4 #include <algorithm>
5 #define maxn 1010
6 using namespace std;
7
8
9 int n, m, a, b;
10 vector<int> g[maxn];
11 int s[maxn][maxn];
12 double f[maxn][maxn];
13
14 void bfs( int src ) {
15 queue<int> qu;
16 s[src][src] = src;
17 for( int t=0; t<g[src].size(); t++ ) {
18 int v = g[src][t];
19 s[src][v] = v;
20 qu.push( v );
21 }
22 while( !qu.empty() ) {
23 int u = qu.front();
24 qu.pop();
25 for( int t=0; t<g[u].size(); t++ ) {
26 int v = g[u][t];
27 if( s[src][v] ) continue;
28 s[src][v] = s[src][u];
29 qu.push(v);
30 }
31 }
32 }
33 void dodp( int i, int j ) {
34 double &dv = f[i][j];
35 if( dv>-0.5 ) return;
36 if( i==j ) {
37 dv = 0.0;
38 return;
39 }
40 if( s[i][j]==j || s[s[i][j]][j]==j ) {
41 dv = 1.0;
42 return;
43 }
44 dv = 0.0;
45 for( int t=0; t<g[j].size(); t++ ) {
46 int v = g[j][t];
47 dodp( s[s[i][j]][j], v );
48 dv += f[s[s[i][j]][j]][v];
49 }
50 dv /= g[j].size();
51 dv += 1.0;
52 }
53
54 int main() {
55 scanf( "%d%d%d%d", &n, &m, &a, &b );
56 for( int i=1,u,v; i<=m; i++ ) {
57 scanf( "%d%d", &u, &v );
58 g[u].push_back(v);
59 g[v].push_back(u);
60 }
61 for( int i=1; i<=n; i++ ) sort( g[i].begin(), g[i].end() );
62 for( int i=1; i<=n; i++ ) bfs(i);
63 for( int i=1; i<=n; i++ )
64 g[i].push_back(i);
65 for( int i=1; i<=n; i++ )
66 for( int j=1; j<=n; j++ ) f[i][j] = -1.0;
67 dodp( a, b );
68 printf( "%.3lf\n", f[a][b] );
69 }