#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,n) for(int i=0; i < (n); i++) #define FORD(i,n) for(int i=(n)-1; i >= 0; i--) #define FORTO(i,a,b) for (int i = (a); i <= (b); ++i) #define DEBUG(x) cout << '>' << #x << ' ' << x << endl; #define SIZE(x) int(x.size()) typedef pair PII; typedef long long ll; #define MAXN 10047 vector Adj[MAXN]; bool V[MAXN]; // visited bool B[MAXN]; // broken set R; bool DFS(int v) { if (V[v]) return false; V[v] = true; FOR(i,SIZE(Adj[v])) { int u = Adj[v][i]; if (!V[u]) { bool r = DFS(u); B[v] ^= r; if (r) R.insert(PII(v,u)); } } return B[v]; } char S[MAXN]; int main() { while (true) { int N, M; scanf("%d %d", &N, &M); if (!N) return 0; FORTO(i,1,N) { Adj[i].clear(); V[i] = false; B[i] = false; } R.clear(); vector X; FOR(i,M) { int a, b; scanf("%d %d", &a, &b); X.push_back(PII(a,b)); Adj[a].push_back(b); Adj[b].push_back(a); } scanf(" %s", S); FORTO(i,1,N) { if (S[i-1] == 'e' && SIZE(Adj[i])%2 == 1) B[i] = true; if (S[i-1] == 'o' && SIZE(Adj[i])%2 == 0) B[i] = true; } bool ok = true; FORTO(i,1,N) if (DFS(i)) ok = false; if (!ok) { printf("impossible\n"); } else { printf("%d\n", M-SIZE(R)); FOR(i,M) { PII back = PII(X[i].second,X[i].first); if (!R.count(X[i]) && !R.count(back)) printf("%d %d\n", X[i].first, X[i].second); } } } return 0; }