#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
struct Node {
int v, w,next;
};
const int N = 1e5;
Node g[N];
int head[N], cnt = 1;
int d[N];
int b[N];
void add(int u, int v, int w) {
g[cnt].v = v;
g[cnt].w = w;
g[cnt].next = head[u];
head[u] = cnt++;
}
void b_add(int a, int b,int w) {
add(a, b, w);
add(b, a, w);
}
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
int get_dist(int a, int b) {
return a * b / gcd(a, b);
}
void generate() {
for (int i = 1; i < 2022; i++) {
for (int j = 1; j < 2022; j++) {
if (i == j) continue;
if (abs(i - j) <= 21) {
b_add(i, j, get_dist(i, j));
}
}
}
}
int dij(int n) {
priority_queue<PII, vector<PII>, greater<PII> > q;
d[1] = 0;
q.push({0, 1});
while (q.size()) {
auto now = q.top();
q.pop();
int u = now.second;
if (b[u]) continue;
b[u] = 1;
for (int i = head[u]; i != -1; i = g[i].next) {
int v = g[i].v;
if (d[v] > d[u] + g[i].w ){
d[v] = d[u] + g[i].w;
q.push({d[v], v});
}
}
}
return d[n];
}
int main() {
cout << get_dist(15,25) << endl;
memset(d, 0x3f, sizeof d);
memset(head, -1, sizeof(head));
generate();
cout << dij(2021);
return 0;
}