#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int key, id;
} data;

void merge_sort(data x[], int n)
{
	static data y[200001] = {};
	if (n <= 1) return;
	merge_sort(&(x[0]), n/2);
	merge_sort(&(x[n/2]), (n+1)/2);
	
	int i, p, q;
	for (i = 0, p = 0, q = n/2; i < n; i++) {
		if (p >= n/2) y[i] = x[q++];
		else if (q >= n) y[i] = x[p++];
		else y[i] = (x[p].key < x[q].key)? x[p++]: x[q++];
	}
	for (i = 0; i < n; i++) x[i] = y[i];
}

int main()
{
	int i, N, X[200001], Y[200001];
	char U[200001];
	scanf("%d", &N);
	for (i = 1; i <= N; i++) scanf("%d %d %c ", &(X[i]), &(Y[i]), &(U[i]));
	
	int j, k, x, y, z, num[400001] = {}, p[400001] = {}, ans = 1 << 30;
	data *line[400001] = {};
	for (i = 1; i <= N; i++) if (U[i] == 'U' || U[i] == 'D') num[X[i]]++;
	for (x = 0; x <= 200000; x++) if (num[x] > 0) line[x] = (data*)malloc(sizeof(data) * (num[x] + 1));
	for (i = 1; i <= N; i++) {
		if (U[i] == 'U' || U[i] == 'D') {
			line[X[i]][p[X[i]]].key = Y[i];
			line[X[i]][p[X[i]]++].id = i;
		}
	}
	for (x = 0; x <= 200000; x++) {
		if (line[x] == NULL) continue;
		merge_sort(line[x], num[x]);
		for (j = 0; j < num[x] - 1; j++) if (U[line[x][j].id] == 'U' && U[line[x][j+1].id] == 'D' && line[x][j+1].key - line[x][j].key < ans) ans = line[x][j+1].key - line[x][j].key;
		free(line[x]);
		line[x] = NULL;
	}
	
	for (y = 0; y <= 200000; y++) {
		num[y] = 0;
		p[y] = 0;
	}
	for (i = 1; i <= N; i++) if (U[i] == 'L' || U[i] == 'R') num[Y[i]]++;
	for (y = 0; y <= 200000; y++) if (num[y] > 0) line[y] = (data*)malloc(sizeof(data) * (num[y] + 1));
	for (i = 1; i <= N; i++) {
		if (U[i] == 'L' || U[i] == 'R') {
			line[Y[i]][p[Y[i]]].key = X[i];
			line[Y[i]][p[Y[i]]++].id = i;
		}
	}
	for (y = 0; y <= 200000; y++) {
		if (line[y] == NULL) continue;
		merge_sort(line[y], num[y]);
		for (j = 0; j < num[y] - 1; j++) if (U[line[y][j].id] == 'R' && U[line[y][j+1].id] == 'L' && line[y][j+1].key - line[y][j].key < ans) ans = line[y][j+1].key - line[y][j].key;
		free(line[y]);
		line[y] = NULL;
	}
	
	for (z = 0; z <= 400000; z++) {
		num[z] = 0;
		p[z] = 0;
	}
	for (i = 1; i <= N; i++) if (U[i] == 'U' || U[i] == 'R') num[X[i]+Y[i]]++;
	for (z = 0; z <= 400000; z++) if (num[z] > 0) line[z] = (data*)malloc(sizeof(data) * (num[z] + 1));
	for (i = 1; i <= N; i++) {
		if (U[i] == 'U' || U[i] == 'R') {
			line[X[i]+Y[i]][p[X[i]+Y[i]]].key = X[i] - Y[i];
			line[X[i]+Y[i]][p[X[i]+Y[i]]++].id = i;
		}
	}
	for (z = 0; z <= 400000; z++) {
		if (line[z] == NULL) continue;
		merge_sort(line[z], num[z]);
		for (j = 0; j < num[z] - 1; j++) if (U[line[z][j].id] == 'R' && U[line[z][j+1].id] == 'U' && line[z][j+1].key - line[z][j].key < ans) ans = line[z][j+1].key - line[z][j].key;
		free(line[z]);
		line[z] = NULL;
	}
	
	for (z = 0; z <= 400000; z++) {
		num[z] = 0;
		p[z] = 0;
	}
	for (i = 1; i <= N; i++) if (U[i] == 'D' || U[i] == 'L') num[X[i]+Y[i]]++;
	for (z = 0; z <= 400000; z++) if (num[z] > 0) line[z] = (data*)malloc(sizeof(data) * (num[z] + 1));
	for (i = 1; i <= N; i++) {
		if (U[i] == 'D' || U[i] == 'L') {
			line[X[i]+Y[i]][p[X[i]+Y[i]]].key = X[i] - Y[i];
			line[X[i]+Y[i]][p[X[i]+Y[i]]++].id = i;
		}
	}
	for (z = 0; z <= 400000; z++) {
		if (line[z] == NULL) continue;
		merge_sort(line[z], num[z]);
		for (j = 0; j < num[z] - 1; j++) if (U[line[z][j].id] == 'D' && U[line[z][j+1].id] == 'L' && line[z][j+1].key - line[z][j].key < ans) ans = line[z][j+1].key - line[z][j].key;
		free(line[z]);
		line[z] = NULL;
	}

	for (z = 0; z <= 400000; z++) {
		num[z] = 0;
		p[z] = 0;
	}
	for (i = 1; i <= N; i++) if (U[i] == 'U' || U[i] == 'L') num[X[i]-Y[i]+200000]++;
	for (z = 0; z <= 400000; z++) if (num[z] > 0) line[z] = (data*)malloc(sizeof(data) * (num[z] + 1));
	for (i = 1; i <= N; i++) {
		if (U[i] == 'U' || U[i] == 'L') {
			line[X[i]-Y[i]+200000][p[X[i]-Y[i]+200000]].key = X[i] + Y[i];
			line[X[i]-Y[i]+200000][p[X[i]-Y[i]+200000]++].id = i;
		}
	}
	for (z = 0; z <= 400000; z++) {
		if (line[z] == NULL) continue;
		merge_sort(line[z], num[z]);
		for (j = 0; j < num[z] - 1; j++) if (U[line[z][j].id] == 'U' && U[line[z][j+1].id] == 'L' && line[z][j+1].key - line[z][j].key < ans) ans = line[z][j+1].key - line[z][j].key;
		free(line[z]);
		line[z] = NULL;
	}
	
	for (z = 0; z <= 400000; z++) {
		num[z] = 0;
		p[z] = 0;
	}
	for (i = 1; i <= N; i++) if (U[i] == 'D' || U[i] == 'R') num[X[i]-Y[i]+200000]++;
	for (z = 0; z <= 400000; z++) if (num[z] > 0) line[z] = (data*)malloc(sizeof(data) * (num[z] + 1));
	for (i = 1; i <= N; i++) {
		if (U[i] == 'D' || U[i] == 'R') {
			line[X[i]-Y[i]+200000][p[X[i]-Y[i]+200000]].key = X[i] + Y[i];
			line[X[i]-Y[i]+200000][p[X[i]-Y[i]+200000]++].id = i;
		}
	}
	for (z = 0; z <= 400000; z++) {
		if (line[z] == NULL) continue;
		merge_sort(line[z], num[z]);
		for (j = 0; j < num[z] - 1; j++) if (U[line[z][j].id] == 'R' && U[line[z][j+1].id] == 'D' && line[z][j+1].key - line[z][j].key < ans) ans = line[z][j+1].key - line[z][j].key;
		free(line[z]);
		line[z] = NULL;
	}

	if (ans == 1 << 30) printf("SAFE\n");
	else printf("%d\n", ans * 5);
	fflush(stdout);
	return 0;
}

Measured memory_bytes: 15924