#include <bits/stdc++.h>
using namespace std;
#define SZ(x) (int)(x.size())
#define REP(i, n) for(int i=0;i<(n);++i)
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define RREP(i, n) for(int i=(int)(n)-1;i>=0;--i)
#define RFOR(i, a, b) for(int i=(int)(b)-1;i>=(a);--i)
#define ALL(a) a.begin(),a.end()
#define DUMP(x) cerr<<#x<<" = "<<(x)<<endl
#define DEBUG(x) cerr<<#x<<" = "<<(x)<<" (L"<<__LINE__<<")"<< endl;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
template <typename T1, typename T2>
bool chmax(T1 &a, const T2 &b) {
    if (a < b) { a = b; return true; }
    return false;
}
template <typename T1, typename T2>
bool chmin(T1 &a, const T2 &b) {
    if (a > b) { a = b; return true; }
    return false;
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
    os << p.first << ":" << p.second;
    return os;
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const map<T1, T2> &mp) {
    os << "{";
    int a = 0;
    for (auto &tp : mp) {
        if (a) os << ", "; a = 1;
        os << tp;
    }
    return os << "}";
}
template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
    os << "[";
    REP(i, SZ(v)) {
        if (i) os << ", ";
        os << v[i];
    }
    return os << "]";
}


int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    for (;;) {
        int p, q; cin >> p >> q;
        if (p == 0) break;
        vector<map<char,int>> cnt(p);
        vector<int> indent(p);
        map<char,int> count;
        REP(i, p) {
            string s; cin >> s;
            int j = 0;
            while (j < SZ(s) and s[j] == '.') ++j;
            indent[i] = j;
            for (; j < SZ(s); ++j) {
                if (s[j] == '(') ++count['('];
                if (s[j] == ')') --count['('];
                if (s[j] == '{') ++count['{'];
                if (s[j] == '}') --count['{'];
                if (s[j] == '[') ++count['['];
                if (s[j] == ']') --count['['];
            }
            cnt[i] = count;
        }

        vector<tuple<int,int,int>> cands;
        FOR(r, 1, 21) {
            FOR(c, 1, 21) {
                FOR(s, 1, 21) {
                    int valid = 1;
                    REP(i, p-1) {
                        if (r * cnt[i]['('] + c * cnt[i]['{'] + s * cnt[i]['['] != indent[i+1]) valid = 0;
                    }
                    if (valid) {
                        cands.emplace_back(r, c, s);
                    }
                }
            }
        }

        count.clear();
        vi ans(q);
        REP(i, q) {
            string s; cin >> s;
            if (i == q-1) continue;
            for (char c : s) {
                if (c == '(') ++count['('];
                if (c == ')') --count['('];
                if (c == '{') ++count['{'];
                if (c == '}') --count['{'];
                if (c == '[') ++count['['];
                if (c == ']') --count['['];
            }

            map<int,int> value;
            for (auto &tp : cands) {
                int r, c, s; tie(r, c, s) = tp;
                value[r * count['('] + c * count['{'] + s * count['[']] = 1;
            }
            if (value.size() > 1) ans[i+1] = -1;
            else ans[i+1] = value.begin()->first;
        }

        REP(i, q) {
            if (i) cout << " ";
            cout << ans[i];
        }
        cout << endl;

    }

    return 0;
}



Measured memory_bytes: 3352