#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <utility>
#include <complex>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <deque>
#include <tuple>
#include <bitset>
#include <algorithm>
using namespace std;
typedef long double ld;
typedef long long ll;
typedef vector<int> vint;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
typedef complex<ld> compd;
#define rep(i,n)	for(int i=0;i<n;i++)
#define srep(i,a,n)	for(int i=a;i<n;i++)
#define REP(i,n)	for(int i=0;i<=n;i++)
#define SREP(i,a,n)	for(int i=a;i<=n;i++)
#define rrep(i,n)	for(int i=n-1;i>=0;i--)
#define RREP(i,n)	for(int i=n;i>=0;i--)
#define all(a)	(a).begin(),(a).end()
#define mp(a,b)	make_pair(a,b)
#define mt	make_tuple
#define fst	first
#define scn second
#define bicnt(x)	__buildin__popcount(x)
#define debug(x)	cout<<"debug: "<<x<<endl

const ll inf = (ll)1e9;
const ll mod = (ll)1e9 + 7;
const ld eps = 1e-9;
const int dx[] = { 0,1,0,-1 };
const int dy[] = { 1,0,-1,0 };

map<char, int> length;
map<char, map<int, int> > dat;

int getlength(string s) {
	if (s == "0")	return 0;
	if (s[0] == '0')	return -1;
	int ret = 0;
	rep(i, s.size()) {
		if (s[i] < '0' || '9' < s[i])	return -1;
		ret = ret * 10 + (s[i] - '0');
	}
	return ret;
}

int check(string s,bool need) {
	if (s.size() < 4)	return -1;
	if (s[0] < 'A' || ('Z' < s[0] && s[0] < 'a') || 'z' < s[0])	return -1;
	if (s[1] != '[')	return -1;
	if (s[s.size() - 1] != ']')	return -1;
	if (length.count(s[0]) == 0)	return -1;
	int n = getlength(s.substr(2, s.size() - 3));
	if (length[s[0]] <= n)	return -1;
	if (0 <= n) {
		if (!need)	return n;
		if (need&&dat[s[0]].count(n)==0)	return -1;
		return dat[s[0]][n];
	}
	n = check(s.substr(2, s.size() - 3), true);
	if (n < 0 || length[s[0]] <= n)	return -1;
	if (!need)	return n;
	else if (dat[s[0]].count(n)==0)	return -1;
	return dat[s[0]][n];
}

int main() {
	ifstream ifs("1282_input.txt");
	while (true) {
		vector<string> s;
		while (true) {
			string in;	cin >> in;
			if (in == ".")	break;
			s.push_back(in);
		}
		if (s.size() == 0)	break;
		length.clear();
		dat.clear();
		bool safe = true;
		rep(i, s.size()) {
			int eq = 0;
			while (eq < s[i].size() && s[i][eq] != '=')	eq++;
			if (eq == s[i].size()) {
				bool ok = true;
				if (s[i].size() < 4)	ok = false;
				else {
					if (s[i][0] < 'A' || ('Z' < s[i][0] && s[i][0] < 'a') || 'z' < s[i][0])	ok = false;
					if (s[i][1] != '[')	ok = false;
					if (s[i][s[i].size() - 1] != ']')	ok = false;
					int l = getlength(s[i].substr(2, s[i].size() - 3));
					if (length.count(s[i][0]))	ok = false;
					if (ok)	length[s[i][0]] = l;
				}
				if (!ok) {
					cout << i + 1 << endl;
					safe = false;
					break;
				}
			}
			else {
				bool ok = true;
				if (check(s[i].substr(0, eq), false) == -1)	ok = false;
				int val = getlength(s[i].substr(eq + 1, s[i].size() - eq - 1));
				if (val == -1) {
					val = check(s[i].substr(eq + 1, s[i].size() - eq - 1), true);
					if (val == -1)	ok = false;
				}
				if (ok) {
					int index = getlength(s[i].substr(2, eq - 3));
					if (index == -1)	index = check(s[i].substr(2, eq - 3), true);
					dat[s[i][0]][index] = val;
				}
				else {
					cout << i + 1 << endl;
					safe = false;
					break;
				}
			}
		}
		if (safe)	cout << 0 << endl;
	}
	return 0;
}

Measured memory_bytes: 3160