#include <iostream>
using namespace std;
int n, m, x, y;
int map[101][101];
int prev[101];
int vst[101];
int f = 1, r;
struct
node
{
int c;
void
add( node* q )
{
q[++r] = *this;
prev[r] = f;
}
bool
operator == ( node x )
{
if( x.c == this->c )
return true;
return false;
}
}que[10001];
void
__read__()
{
cin >> n >> m >> x >> y;
for( int i = 1; i <= m; i++ )
{
int p, q;
cin >> p >> q;
map[p][q] =
map[q][p] = true;
}
}
void
__outp__( int t )
{
if( que[t].c != x )
__outp__( prev[t] );
if( que[t].c == x )
cout << que[t].c;
else
cout << "->" << que[t].c;
}
void
__bfs__()
{
node start;
start.c = x;
start.add( que );
vst[x] = true;
if( map[x][y] )
{
cout << x << "->" << y << endl;
exit( 0 );
}
while( 1 )
{
for( int i = 1; i <= n; i++ )
if( !vst[i] && map[que[f].c][i] )
{
vst[i] = true;
node waypoint;
waypoint.c = i;
waypoint.add( que );
}
f++;
if( que[r].c == y )
{
__outp__( r ); cout << endl;
exit( 0 );
}
if( f == r + 1 )
{
cout << "no solution" << endl;
exit( 0 );
}
}
}
int
main()
{
__read__();
__bfs__();
return 0;
}