#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef long double ld; typedef pair PII; #define pb push_back #define fi first #define se second #define REP(i, n) for(int i = 0; i < (int)(n); ++i) #define FOR(i, a, b) for(int i = (int)(a); i <= (int)(b); ++i) #define MAXN 1007 int N; vector > G, U; vector R, V; bool par; void DFS(int x){ V.at(x) = true; if(R.at(x)) par = !par; REP(i, N) if(G.at(x).at(i) && !V.at(i)){ if(par) U.at(x).at(i) = U.at(i).at(x) = !U.at(x).at(i); DFS(i); if(par) U.at(x).at(i) = U.at(i).at(x) = !U.at(x).at(i); } } char buf[MAXN]; int main(){ for(;;){ scanf("%d", &N); if(N == 0) break; G.clear(); G.resize(N, vector(N, false)); int E; scanf("%d", &E); while(E--){ int a, b; scanf("%d %d", &a, &b); --a, --b; G.at(a).at(b) = G.at(b).at(a) = true; } scanf(" %s", buf); R.clear(); R.resize(N); REP(i, N) R.at(i) = (buf[i] == 'o'); U.clear(); U.resize(N, vector(N, false)); V.clear(); V.resize(N, false); bool ok = true; REP(i, N) if(!V.at(i)){ par = false; DFS(i); if(par){ ok = false; break; } } if(!ok) printf("impossible\n"); else{ int res = 0; REP(i, N) FOR(j, i + 1, N - 1) res += U.at(i).at(j); printf("%d\n", res); REP(i, N) FOR(j, i + 1, N - 1) if(U.at(i).at(j)) printf("%d %d\n", i + 1, j + 1); } } return 0; }