#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <set>
using namespace std;

struct brac{
	int A,B,C;
	int dot;
	brac(int A, int B, int C, int dot):A(A),B(B),C(C),dot(dot){}
	brac(){}
};

int main(){
	while(1){
		int p,q;
		cin >> p >> q;
		if(p==0) break;
		
		vector<brac> info(p+q);
		int a=0, b=0, c=0;
		for(int i=0; i<p+q; i++){
			if(i==p) a=b=c=0;
			info[i] = brac(a,b,c,0);
			string str;
			cin >> str;
			bool indent=true;
			int dot=0;
			for(int j=0; j<(int)str.length(); j++){
				if(indent && str[j]=='.') dot++;
				else indent=false;
				if(str[j]=='(') a++;
				if(str[j]==')') a--;
				if(str[j]=='{') b++;
				if(str[j]=='}') b--;
				if(str[j]=='[') c++;
				if(str[j]==']') c--;
			}
			info[i].dot = dot;
		}
		
		vector<set<int> > ans(q);
		for(int i=1; i<=20; i++){
			for(int j=1; j<=20; j++){
				for(int k=1; k<=20; k++){
					bool correct=true;
					for(int t=0; t<p; t++){
						if(i*info[t].A +j*info[t].B +k*info[t].C != info[t].dot){
							correct = false;
							break;
						}
					}
					if(!correct) continue;
					for(int t=0; t<q; t++){
						ans[t].insert( i*info[p+t].A +j*info[p+t].B +k*info[p+t].C );
					}
				}
			}
		}
		
		for(int i=0; i<q-1; i++){
			if(ans[i].size()==0){
				cerr << "error" << endl;
			}
			if(ans[i].size()!=1){
				cout << -1 << " ";
			}else{
				cout << *(ans[i].begin()) << " ";
			}
		}
		if(ans[q-1].size()!=1){
			cout << -1 << endl;
		}else{
			cout << *(ans[q-1].begin()) << endl;
		}
	}
	return 0;
}