#include <bits/stdc++.h>
using namespace std;

#define int long long
#define REP(i, n) for (int i = 0; i < (n); i++)
#define FOR(i, m, n) for (int i = (m); i < (n); i++)

using State = string::const_iterator;

map<string, int> mp;

int expression(State &begin);
int term(State &begin);
int factor(State &begin);
int number(State &begin);
void consume(State &begin, char expected);
bool unknown = false;
int expression(State &begin) {
    int ret = term(begin);
    for (;;) {
        if (*begin == '+') {
            consume(begin, '+');
            // cerr << "add(" << ret;
            ret += term(begin);
            // cerr << "," << ret << endl;
        } else
            break;
    }
    return ret;
}

int term(State &begin) {
    int ret = factor(begin);
    for (;;) {
        if (*begin == '*') {
            consume(begin, '*');
            // cerr << "mult(" << ret;
            ret *= factor(begin);
            // cerr << "," << ret << ")" << endl;
        } else
            break;
    }
    return ret;
}

int factor(State &begin) {
    if (*begin == '(') {
        consume(begin, '(');
        int ret = expression(begin);
        consume(begin, ')');
        return ret;
    } else
        return number(begin);
}

//元素記号か数字
int number(State &begin) {
    int ret = 0;
    char c = *begin;
    if ('A' <= c && c <= 'Z') {
        string mol;
        mol += c;
        begin++;
        if ('a' <= *begin && *begin <= 'z') {
            mol += *begin;
            begin++;
        }
        // cerr << mol << endl;
        if (!mp.count(mol)) {
            unknown = true;
            return ret;
        }
        ret = mp[mol];
        // cerr << ret << endl;
        return ret;
    } else if (isdigit(*begin)) {
        while (isdigit(*begin)) {
            ret *= 10;
            ret += *begin - '0';
            // cerr << ret << endl;
            begin++;
        }
        return ret;
    } else {
        // cerr << *begin << " is not alphabet or number" << endl;
    }
    return ret;
}

void consume(State &begin, char expected) {
    if (*begin == expected)
        begin++;
    else {
        cerr << "Expected '" << expected << "' but got '" << *begin << "'" << endl;
        cerr << "Rest string is '";
        while (*begin) {
            cerr << *begin++;
        }
        cerr << "'" << endl;
        exit(1);
    }
}

string revise(string S) {
    string ret;
    int N = S.size();
    int i = 0;
    while (i < N) {
        if (S[i] == '(' || (S[i] >= 'A' && S[i] <= 'Z')) {
            if (i > 0 && (S[i - 1] != '(')) ret += '+';
            ret += S[i++];
        } else if (isdigit(S[i])) {
            ret += '*';
            while (i < N && isdigit(S[i])) {
                ret += S[i++];
            }
        } else {
            ret += S[i++];
        }
    }
    return ret;
}

void init() {
    string S;
    while (true) {
        cin >> S;
        if (S == "END_OF_FIRST_PART") break;
        int x;
        cin >> x;
        mp[S] = x;
    }
    return;
}

bool solve() {
    string S;
    cin >> S;
    unknown = false;

    if (S == "0") return false;
    S = revise(S);
    State begin = S.begin();
    // cout << S << endl;
    int res = expression(begin);
    if (unknown)
        cout << "UNKNOWN" << endl;
    else
        cout << res << endl;

    return true;
}
signed main() {
    init();
    while (solve())
        ;
}


Measured memory_bytes: 3104