import
java.util.AbstractMap.SimpleEntry;
import
java.util.ArrayDeque;
import
java.util.Queue;
import
java.util.Vector;
public
class
MinEdge {
public
static
int
minEdge(Vector<Vector<Integer> > X,
int
N,
int
M,
int
T,
int
C)
{
Queue<SimpleEntry<Integer, Integer> > Q
=
new
ArrayDeque<
SimpleEntry<Integer, Integer> >();
Q.add(
new
SimpleEntry<Integer, Integer>(
1
,
0
));
Vector<Boolean> V =
new
Vector<Boolean>(N +
1
);
for
(
int
i =
0
; i <= N; i++) {
V.add(
false
);
}
int
crnt, c;
while
(
true
) {
crnt = Q.peek().getKey();
c = Q.peek().getValue();
Q.remove();
if
(crnt == N)
break
;
for
(
int
i : X.get(crnt)) {
if
(!V.get(i)) {
Q.add(
new
SimpleEntry<Integer, Integer>(
i, c +
1
));
V.set(i,
true
);
}
}
}
return
c;
}
public
static
int
findTime(
int
T,
int
C,
int
c)
{
int
ans =
0
;
for
(
int
i =
0
; i < c; i++) {
if
((ans / T) %
2
==
1
)
ans = (ans / T +
1
) * T + C;
else
ans += C;
}
return
ans;
}
public
static
void
main(String[] args)
{
int
N =
5
;
int
M =
5
;
int
T =
3
;
int
C =
5
;
Vector<Vector<Integer> > X
=
new
Vector<Vector<Integer> >();
for
(
int
i =
0
; i <= N; i++) {
X.add(
new
Vector<Integer>());
}
X.get(
1
).add(
2
);
X.get(
1
).add(
3
);
X.get(
1
).add(
4
);
X.get(
2
).add(
4
);
X.get(
2
).add(
5
);
X.get(
3
).add(
1
);
X.get(
4
).add(
1
);
X.get(
4
).add(
2
);
X.get(
5
).add(
2
);
int
c = minEdge(X, N, M, T, C);
int
ans = findTime(T, C, c);
System.out.println(ans);
}
}