#include<iostream>
#include<queue>
#include<cstdio>
#include<string>
#include<map>
#include<set>
using namespace std;

int N, M;
int a,b;
vector<int> g[1040];
bool o[1040];
bool was[1040];
bool pen;
bool isimp;
map<pair<int, int>, int> mp;
set<pair<int, int> > st;
pair<int, int> tmpp;
int tmpi;
vector<pair<int, int> > out;

void add(int k, int nb)
{
	if(k>nb)
	{
		tmpi = k;
		k = nb;
		nb = tmpi;
	}
	
	tmpp=make_pair(k,nb);
	if(st.find(tmpp) == st.end())
	{
		st.insert(tmpp);
		mp[tmpp] = 1;
	}
	else
	{
		mp[tmpp]++;
	}

}

void DFS(int k)
{
	was[k] = true;
	if(o[k])
	{
		pen = !pen;
	}

	for(int i = 0; i < g[k].size(); i++)
	{
		int nb = g[k][i];
		if(!was[nb])
		{
			if(pen)
			{
				add(nb, k);
			}
			DFS(nb);
			if(pen)
			{
				add(nb, k);
			}
		}
	}
}

int main(){
//	scanf("%d%d", &N, &M);
	cin >> N >> M;
	while(!(N == 0 && M == 0))
	{
		for(int i=1;i<=N;i++)
		{
			g[i].clear();
		}
		
		for(int i=0;i<M;i++)
		{
//			scanf("%d%d", &a, &b);
			cin >> a >> b;
			g[a].push_back(b);
			g[b].push_back(a);
		}
		
		string s;
		cin >> s;
		for(int i=1;i<=N;i++)
		{
			o[i]=(s[i-1]=='o');
			was[i]=false;
		}
		
		//cout << "bug" << endl;
		
		isimp = false;
		out.clear();
		
		set<pair<int, int> >::iterator it;
		
		for(int i=1;i<=N;i++)
		{
			if(!was[i] && !isimp)
			{
				mp.clear();
				st.clear();
				pen = false;
				DFS(i);
				if (pen)
				{
					//cout << i << endl;
					isimp = true;
				}
				
				if(!isimp)
				{
					it = st.begin();
					while(it!= st.end())
					{
						if(mp[*it] % 2 == 1)
						{
							out.push_back(*it);
						}
						it++;
					}
				}
			}
		}
		
		if(!isimp)
		{
			cout << out.size() << endl;
			for(int i=0;i<out.size();i++)
			{
				cout << out[i].first << " " << out[i].second << endl;
			}
		}
		else
		{
			cout << "impossible" << endl;
		}
	
		//scanf("%d%d", &N, &M);
		cin >> N >> M;
	}
	
	return 0;
}
